大家先看一段簡短代碼就很明白了。重點是 函數的入參 函數的返回
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:對基本類型來說,正常情況下是不需要考慮用指針的。等下我再加入這部分。