结构体方法中接收者传值能对结构体对象造成影响?
对于一个结构体,它的方法的接收者可以传值也可以传指针,传指针。传指针的时候,方法可以对结构体对象内部的数据进行修改,这是毋庸置疑的。问题是在于传值的时候,为什么有时候也能修改?
type H []int
func (h H) test(){} //传值
func (h *H) test(){} //传指针
下面是示例:
package main
import "fmt"
type Heap []int
type H struct {
h1 []int
h2 string
}
func (h Heap) test() {
h[0], h[1] = h[1], h[0] //这里可以成功交换位置,说明修改成功了
h = h[:2] //这一步操作失效了
}
func (h H) test1() {
h.h1[0], h.h1[1] = h.h1[1], h.h1[0] //
h.h2 = "test"
}
func main() {
l := Heap{1, 2, 3, 4}
l1 := H{
h1: []int{1, 2, 3, 4},
}
l.test()
fmt.Println(l1)
fmt.Println(l)
}
对应的输出
go run 1.go
{[1 2 3 4] }
[2 1 3 4]
heap类型其实就是一个切片,交换heap中元素的位置可以,但是不能增加或者删除。我现在比较疑惑的就是为什么可以交换位置??值传递,传进去的应该是原heap的拷贝,那么新的heap做的操作应该不会影响到原heap。
推荐文章: