1. 程式人生 > >[GO]變量內存和變量地址

[GO]變量內存和變量地址

1.5 file poi time clas class jetbrains 錯誤 build

package main

import "fmt"

func main()  {
    var a int = 10
    //每個變量都有兩層含義,變量的內存和變量的地址
    fmt.Printf("a = %d\n", a) //變量的內存 10
    fmt.Printf("a = %v\n", &a) //變量的地址 0xc042060080

    //保存某個變量的地址,需要指針類型, *int保存int的地址, **int保存*int的地址
    //聲明(定義),定義只是特殊的聲明
    //定義一個變量p,類型為*int
    var p *int
    p = &a
    fmt.Printf(
"p = %v, &a = %v\n", p, &a) *p = 666 //*p操作的不是p的內存,是p指向的內存(其實就是a) fmt.Printf("*p = %v, a = %v\n", *p, a) }

執行結果為

GOROOT=C:\Go #gosetup
GOPATH=E:\go\develop #gosetup
C:\Go\bin\go.exe build -i -o C:\Users\baylor\AppData\Local\Temp\___go_build__go.exe E:/awesomeProject01/指針的基本操作.go #gosetup
"C:\Program Files\JetBrains\GoLand 2018.1.5\bin\runnerw.exe" C:\Users\baylor\AppData\Local\Temp\___go_build__go.exe #gosetup a = 10 a = 0xc042060080 p = 0xc042060080, &a = 0xc042060080 *p = 666, a = 666

註意,永遠不要操作沒有合法指向的內存,比如:

package main

import "fmt"

func main()  {
    var p *int
    p = nil
    fmt.Printf("p = %v\n
", p) *p = 666 //這個就是錯誤的,因為它沒有正確的指向內存地址 fmt.Printf("*p = %v\n", *p) }

執行結果

GOROOT=C:\Go #gosetup
GOPATH=E:\go\develop #gosetup
C:\Go\bin\go.exe build -i -o C:\Users\baylor\AppData\Local\Temp\___go_build__go.exe E:/awesomeProject01/不要操作沒有合法指向的內存.go #gosetup
"C:\Program Files\JetBrains\GoLand 2018.1.5\bin\runnerw.exe" C:\Users\baylor\AppData\Local\Temp\___go_build__go.exe #gosetup
p = <nil>
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x1 addr=0x0 pc=0x48ce1c]

goroutine 1 [running]:
main.main()
    E:/awesomeProject01/不要操作沒有合法指向的內存.go:10 +0x7c

正確的寫法應該是這樣的

var a int
p = &a
*p = 666
fmt.Printf("*p = %v\n", *p)

執行結果

p = <nil>
*p = 666

[GO]變量內存和變量地址