Go語言的pointer(指標)簡單範例。
有學過C或C++程式對指標會非常熟悉,而Go的pointer概念一樣,是指向記憶體位置的變數。如果學過Java物件參照的概念也可以輕易地理解什麼是pointer。
Go使用星號*
(asterisk)宣告一個指向型態為int
的pointer 變數p
。由於p
尚未指向任何變數的記憶體位址,所以值為nil
。
package main
import "fmt"
func main() {
var p *int // 宣告變數p為指向int型態的pointer
fmt.Println(p) // <nil>
}
在變數前加上&
(ampersand)符號即可取得該變數的記憶體位置,例如下面取得變數i
的指標為p
並印出記憶體位址。
package main
import "fmt"
func main() {
var p *int
fmt.Println(p) // <nil>
i := 12 // 宣告變數i及賦值12
p = &i // 在變數i前加上'&'取得指向i記憶體位址的pointer放入p
fmt.Println(p) // 0xc00011a008
}
在pointer變數前加上*
代表所指向的變數。
package main
import "fmt"
func main() {
var p *int
fmt.Println(p) // <nil>
i := 12 // 宣告變數i及賦值12
p = &i // 在變數i前加上'&'取得指向i記憶體位址的pointer放入p
fmt.Println(p) // 0xc00011a008
fmt.Println(*p) // 12, 在pointer p前加上'*'代表指向的變數i
*p = 34 // 把p指向的變數i設為34
fmt.Println(i) // 34
}
參考「Golang Pointer符號整理」。
另一個範例。
package main
import "fmt"
func main() {
message := "hello world" // 宣告字串變數message值為"hello world"
fmt.Println(message) // hello world
p := &message // 在變數message前使用'&'取得指向記憶體位址的pointer並設為p
fmt.Println(p) // 印出pointer p指向的記憶體位址,這邊為0xc000010240
fmt.Println(*p) // 在pointer p前加上'*'印出pointer p指向的變數值,即"hello world"
*p = "hello go pointers" // 在pointer p前加上'*'設定指向變數message的值為"hello go pointers"
fmt.Println(message) // hello go pointers
}
pointer只能取得同型態變數的記憶體位址。例如下面取得字串變數message
放入int
型態的pointer p
時會發生錯誤。
package main
import "fmt"
func main() {
var p *int
message := "hello world" // 宣告字串變數message值為"hello world"
p = &message // 錯誤,cannot use &message (type *string) as type *int in assignment
fmt.Println(*p)
}
沒有留言:
張貼留言