Ruby 為例:
x = "Hello"
y = x
puts x.object_id == y.object_id # true
x = "World"
puts x.object_id == y.object_id # false
Ruby 在 y = x 時,會將 pointer 指到同個 reference ,但如果 x = "World" 時,就又會多儲存到新的 reference。
Golang 為例:
package main
import "fmt"
func modifyValue(x int) {
x = x * 2
fmt.Println("func modifyValue 內部:", x) // 20
}
func modifyPointer(ptr *int) {
*ptr = *ptr * 2
fmt.Println("func modifyPointer 內部:", *ptr) // 20
}
func assignNewValue(input int) int {
return input * 2
}
func main() {
value := 10
fmt.Println("呼叫 func 前的值:", value) //10
modifyValue(value)
fmt.Println("呼叫完 func modifyValue 的值:", value) // 10
modifyPointer(&value)
fmt.Println("呼叫完 func modifyPointer 的值:", value) // 20
newValue := assignNewValue(value)
fmt.Println("呼叫完 func assignNewValue 後的 old value 值:", value) // 20
fmt.Println("呼叫完 func assignNewValue 的值:", newValue) // 40
}
可以看出幾點:
func modifyValue不傳入 reference 的話,即使在 func 裡面的值改變,回到func main在印出 value 時,還是會取得原本的 10,而不是 20func modifyPointer傳入 reference 後,會改變原來的值,使 value 變為 20- 如果不傳入
reference又想要改變值,那就得額外多記 newValue 變數到 reference 上,使 value 和 newValue 同時存在,佔用兩組 reference