当前位置:  首页>> 技术小册>> GO面试指南

在 Go 中,slice 中的元素是可寻址的。这是因为 slice 中的元素是以连续的方式存储在底层数组中的,因此可以通过索引来获取元素的地址。

以下是一个示例代码,展示了 slice 中元素的可寻址性:

  1. package main
  2. import "fmt"
  3. func main() {
  4. s := []int{1, 2, 3}
  5. fmt.Printf("s 的地址:%p\n", &s)
  6. for i := range s {
  7. fmt.Printf("s[%d] 的地址:%p,值:%d\n", i, &s[i], s[i])
  8. }
  9. }

在这个示例代码中,我们定义了一个 slice s,并将其初始化为 {1, 2, 3}。然后,我们打印了 slice 变量 s 和每个元素的地址。输出结果如下:

  1. s 的地址:0xc0000144a0
  2. s[0] 的地址:0xc0000144a0,值:1
  3. s[1] 的地址:0xc0000144a8,值:2
  4. s[2] 的地址:0xc0000144b0,值:3

可以看到,slice 变量 s 的地址和第一个元素 s[0] 的地址相同,这是因为 slice 实际上是一个包含底层数组指针、长度和容量等信息的结构体。而每个元素的地址是连续的,这说明它们是按顺序存储在底层数组中的。

需要注意的是,尽管 slice 中的元素是可寻址的,但是如果尝试将 slice 本身作为参数传递给函数,并修改其中的元素,可能会导致程序的意外行为。这是因为 slice 本身只包含底层数组的指针、长度和容量等信息,而没有对底层数组进行拷贝,因此多个 slice 可能共享同一个底层数组。

如果在函数中修改了 slice 中的元素,会影响到所有共享同一个底层数组的 slice。因此,如果需要修改 slice 中的元素,最好将 slice 的拷贝作为参数传递给函数。


该分类下的相关小册推荐: