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 來確保對象是不可變的。
留言
張貼留言