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,而不是 20
  • func modifyPointer 傳入 reference 後,會改變原來的值,使 value 變為 20
  • 如果不傳入 reference 又想要改變值,那就得額外多記 newValue 變數到 reference 上,使 value 和 newValue 同時存在,佔用兩組 reference