GO(5) - pointer
Go 跟 C 概念很類似,能透過 pointer 取得變數的 address。
變數的 address 相同,才能確保操作的對象。
另外 pass-by-address 的操作能減少對象被拷貝的次數,提高程式的效能。
1. 取得 address:
定義一個變數 a,並利用 pointer 取得 a 的 address。
func main() { a := 1 ptr := &a fmt.Printf("Address of a is: %p\n", ptr) }
用 * 號對 pointer 取值。
func main() { a := 1 ptr := &a fmt.Printf("Address of a is: %p\n", ptr) val := *ptr fmt.Printf("The value of the pointer is: %d\n", val) }
2. pass-by-value:
建立一個函式幫傳進來的變數+1。
func addOne(a int) { fmt.Printf("Address (addOne): %p\n", &a) a += 1 } func main() { a := 1 fmt.Printf("Address (main): %p\n", &a) addOne(a) fmt.Println("The value of a:", a) // 1 }
由 Printf 顯示兩個變數的 address 不同,所以被 +1 的對象不是 main() 裡面的 a 而是一個拷貝出來的對象。
3. pass-by-address:
這次傳入的對象為 a 的 address,由 Printf 卻認操作的是同一物件。
func addOne(ptr *int) { fmt.Printf("Address (addOne): %p\n", ptr) *ptr += 1 } func main() { a := 1 fmt.Printf("Address (main): %p\n", &a) addOne(&a) fmt.Println("The value of a:", a) // 2 }
我們由 address 取值可以確保被操作的對象為 main() 裡面的 a。
pass-by-address 能減少變數的拷貝並提高程式的效能,但要小心 side effect 的產生。
像 scala 的風格不喜歡函式中改動變數,所以會使用 immutable 來確保對象是不可變的。
留言
張貼留言