Golang值傳遞,到底是用指針還是引用呢

大家先看一段簡短代碼就很明白了。重點是 函數的入參 函數的返回

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:對基本類型來說,正常情況下是不需要考慮用指針的。等下我再加入這部分。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章