在記憶體中,都是由address與value組成的,address是這個記憶體的位置(也可以叫做pointer),value是這個記憶體真正存的值
假設宣告一個型別為persion{}的變數jim,go會自動找一個空的記憶體位置,把它存進去,例如存在001
call by value :function每次呼叫的時候,如果有傳入值的話,總是會複製一份新的值在此作用域裡面使用。因此改變此值只會改變複製的那一份,不會動到其他的值
call by reference: function每次在呼叫的時候,如果有值傳入,會直接傳入此值的reference。因此改變這個值也會改變到其他使用此值的地方
不過如果寫一個function要來改變jim的話,例如function updateName, receiver p,
由於go 的是一個 call by value的語言,所以每次有值傳給一個function的時候, go 總是都會把jim的值複製一份,保存在新的記憶體位置,這樣就改不到了
這樣改寫,才能改到 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