例如
var myStructRef *Vertex
var myStruct Vertex
myStructRef = &Vertex{2, 3}
myStruct = Vertex{2, 3}
fmt.Println(myStructRef)
fmt.Println(myStruct)
changeByReferenceStruct(myStructRef)
changeByValueStruct(myStruct)
fmt.Println(myStructRef)
fmt.Println(myStruct)
func changeByValueStruct(myStruct Vertex) {
myStruct.X = 5
fmt.Println(myStruct)
}
func changeByReferenceStruct(myStruct *Vertex) {
myStruct.X = 7
fmt.Println(myStruct)
}
myStructRef *Vertex
和myStruct Vertex
都不是指向结构本身的指针吗?在函数中修改结构时,为什么行为上会有差异?changeByValueStruct
中创建新的结构吗?
当您将指针作为参数传递时,实际情况是创建了该指针的副本并将其传递给基础函数。不应将其与传递引用混淆。
让我们看一个例子来更好地理解它:
package main
import (
"fmt"
)
type Point struct {
x int
y int
}
func (p Point) String() string {
return fmt.Sprintf("(%d, %d)", p.x, p.y)
}
func modifyValue(point Point) {
point.x += 10
}
func modifyPointer(point *Point) {
point.x = 5
point.y = 5
}
func modifyReference(point *Point) {
point = &oint{5, 5}
}
func main() {
p := Point{0, 0}
fmt.Println(p) // prints (0, 0)
modifyValue(p)
fmt.Println(p) // prints (0, 0)
modifyPointer(&p)
fmt.Println(p) // prints (5, 5)
p = Point{0, 0}
modifyReference(&p)
fmt.Println(p) // prints (0, 0)
}
ModifyValue 函数内部发生的事情是,对Point结构的完全不同的实例进行了修改,因此调用该函数时传递的值不受影响。关于pointers - 传递一个结构体和该结构体的指针有什么区别,难道它们都不都是指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44872739/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |