大家先看一段简短代码就很明白了。重点是 函数的入参 函数的返回
type Foo struct {
Name string
}
func change(foo Foo) Foo {
foo.Name = "changed"
return foo
}
func changePointer(foo *Foo) Foo {
foo.Name = "changed"
log.Printf("change1 Name: %s,change pointer: %p", foo.Name, foo)
log.Printf("change2 Name: %s,change pointer: %p", foo.Name, &*foo)
return *foo
}
func pointerTest() {
foo := Foo{Name: "test", Age: 123}
log.Printf("foo Name: %s,foo pointer: %p", foo.Name, &foo)
fooo := change(foo)
log.Printf("fooo Name: %s,fooo pointer: %p", fooo.Name, &fooo)
log.Printf("foo Name: %s,foo pointer: %p", foo.Name, &foo)
foooo := changePointer(&foo)
foooo.Name = "final"
log.Printf("foooo Name: %s,foooo pointer: %p", foooo.Name, &foooo)
log.Printf("foo Name: %s,foo pointer: %p", foo.Name, &foo)
}
func main() {
pointerTest()
}
输出如下:
2019-08-16 15:54:07.400133 I | foo Name: test,foo pointer: 0xc000170120
2019-08-16 15:54:07.400296 I | fooo Name: changed,fooo pointer: 0xc000106cc0
2019-08-16 15:54:07.400302 I | foo Name: test,foo pointer: 0xc000170120
2019-08-16 15:54:07.400308 I | change1 Name: changed,change pointer: 0xc000170120
2019-08-16 15:54:07.400312 I | change2 Name: changed,change pointer: 0xc000170120
2019-08-16 15:54:07.400317 I | foooo Name: final,foooo pointer: 0xc000106ce0
2019-08-16 15:54:07.400321 I | foo Name: changed,foo pointer: 0xc000170120
大家看完这段代码,就都懂了哦。
重点:
参数是值拷贝,函数返回也是值拷贝。
TODO:对基本类型来说,正常情况下是不需要考虑用指针的。等下我再加入这部分。