当前位置:   article > 正文

GO语言中的数据结构--切片(动态数组)_go 动态定义切片

go 动态定义切片

切片

切片是一种比较特殊的数据结构。它围绕动态数组的概念构建,可以按需自动增长和缩小。总的来说它可理解为动态数组,并根据切片里的元素自动调整切片长度。

切片指针

常用定义方式如下

  1. var name []*type //定义方式一
  2. name := []*type{} //定义方式二

需要注意的是,切片指针只能存放内存地址的数据格式,需要获取对应数值时需要加上取值操作符“*”。例子如下

  1. package main
  2. import "fmt"
  3. func main() {
  4. var nums []*int
  5. for i := 0; i < 5; i++ {
  6. nums = append(nums, &i)
  7. }
  8. for i, v := range nums {
  9. _ = i
  10. fmt.Printf("%v ", v)
  11. }
  12. }

得到的结果为地址

0xc00001a0a8 0xc00001a0a8 0xc00001a0a8 0xc00001a0a8 0xc00001a0a8 

打印输出时,加上取值操作符后,结果为

5 5 5 5 5 

当然你可能已经发现了,加上取值操作符后我们预期出现的结果应该是:”0,1,2,3,4“,为什么会是“5,5,5,5,5“呢?

再看看地址,发现这五个数都是同一个内存地址。这说明在向nums中添加元素时我们添加的都是同一个内存地址。再往前推就是说明变量i的地址不变,只有值变了。

我们再仔细观察第一个循环,发现每次往nums里添加的是变量i的值,变量i在这个循环中地址始终不变。而由于nums作为切片指针,它只能存放地址,而这些地址又来自同一个变量,那么最后的结果肯定是相同的了。

解决办法也很简单,循环内重新定义一个中间变量,这样在每次循环这个变量的地址都会改变

  1. package main
  2. import "fmt"
  3. func main() {
  4. var nums []*int
  5. for i := 0; i < 5; i++ {
  6. var tmp int = i
  7. nums = append(nums, &tmp)
  8. }
  9. for _, v := range nums {
  10. fmt.Printf("%v ", *v)
  11. }
  12. }

结果为

 0 1 2 3 4

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/761144
推荐阅读
相关标签
  

闽ICP备14008679号