Pointer

在記憶體中,都是由address與value組成的,address是這個記憶體的位置(也可以叫做pointer),value是這個記憶體真正存的值

Screen Shot 2021-12-27 at 10.11.33 PM.png

假設宣告一個型別為persion{}的變數jim,go會自動找一個空的記憶體位置,把它存進去,例如存在001

Screen Shot 2021-12-27 at 10.11.48 PM.png

Call by value

call by value :function每次呼叫的時候,如果有傳入值的話,總是會複製一份新的值在此作用域裡面使用。因此改變此值只會改變複製的那一份,不會動到其他的值

call by reference: function每次在呼叫的時候,如果有值傳入,會直接傳入此值的reference。因此改變這個值也會改變到其他使用此值的地方

不過如果寫一個function要來改變jim的話,例如function updateName, receiver p,

由於go 的是一個 call by value的語言,所以每次有值傳給一個function的時候, go 總是都會把jim的值複製一份,保存在新的記憶體位置,這樣就改不到了

Screen Shot 2021-12-27 at 10.13.12 PM.png

這樣改寫,才能改到 jim 的值

func (pointerToPersion *person) updateName(newFirstName string) {
	// 👆 這個function的reciver的型別是:指向person的pointer
	// 👇 把這個pointer變其記憶體位置中的value,然後修改
	(*pointerToPersion).firstName = newFirstName
}

jimPointer := &jim
jimPointer.update("Jimmy")
jim.print()

memory address = pointer

符號使用