在 Go 中,slice 中的元素是可寻址的。这是因为 slice 中的元素是以连续的方式存储在底层数组中的,因此可以通过索引来获取元素的地址。
以下是一个示例代码,展示了 slice 中元素的可寻址性:
package main
import "fmt"
func main() {
s := []int{1, 2, 3}
fmt.Printf("s 的地址:%p\n", &s)
for i := range s {
fmt.Printf("s[%d] 的地址:%p,值:%d\n", i, &s[i], s[i])
}
}
在这个示例代码中,我们定义了一个 slice s,并将其初始化为 {1, 2, 3}。然后,我们打印了 slice 变量 s 和每个元素的地址。输出结果如下:
s 的地址:0xc0000144a0
s[0] 的地址:0xc0000144a0,值:1
s[1] 的地址:0xc0000144a8,值:2
s[2] 的地址:0xc0000144b0,值:3
可以看到,slice 变量 s 的地址和第一个元素 s[0] 的地址相同,这是因为 slice 实际上是一个包含底层数组指针、长度和容量等信息的结构体。而每个元素的地址是连续的,这说明它们是按顺序存储在底层数组中的。
需要注意的是,尽管 slice 中的元素是可寻址的,但是如果尝试将 slice 本身作为参数传递给函数,并修改其中的元素,可能会导致程序的意外行为。这是因为 slice 本身只包含底层数组的指针、长度和容量等信息,而没有对底层数组进行拷贝,因此多个 slice 可能共享同一个底层数组。
如果在函数中修改了 slice 中的元素,会影响到所有共享同一个底层数组的 slice。因此,如果需要修改 slice 中的元素,最好将 slice 的拷贝作为参数传递给函数。