zoukankan      html  css  js  c++  java
  • [GO]变量内存和变量地址

    package main
    
    import "fmt"
    
    func main()  {
        var a int = 10
        //每个变量都有两层含义,变量的内存和变量的地址
        fmt.Printf("a = %d
    ", a) //变量的内存 10
        fmt.Printf("a = %v
    ", &a) //变量的地址 0xc042060080
    
        //保存某个变量的地址,需要指针类型, *int保存int的地址, **int保存*int的地址
        //声明(定义),定义只是特殊的声明
        //定义一个变量p,类型为*int
        var p *int
        p = &a
        fmt.Printf("p = %v, &a = %v
    ", p, &a)
        *p = 666 //*p操作的不是p的内存,是p指向的内存(其实就是a)
        fmt.Printf("*p = %v, a = %v
    ", *p, a)
    }

    执行结果为

    GOROOT=C:Go #gosetup
    GOPATH=E:godevelop #gosetup
    C:Goingo.exe build -i -o C:UsersaylorAppDataLocalTemp\___go_build__go.exe E:/awesomeProject01/指针的基本操作.go #gosetup
    "C:Program FilesJetBrainsGoLand 2018.1.5in
    unnerw.exe" C:UsersaylorAppDataLocalTemp\___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
    ", p)
    
        *p = 666 //这个就是错误的,因为它没有正确的指向内存地址
        fmt.Printf("*p = %v
    ", *p)
    }

    执行结果

    GOROOT=C:Go #gosetup
    GOPATH=E:godevelop #gosetup
    C:Goingo.exe build -i -o C:UsersaylorAppDataLocalTemp\___go_build__go.exe E:/awesomeProject01/不要操作没有合法指向的内存.go #gosetup
    "C:Program FilesJetBrainsGoLand 2018.1.5in
    unnerw.exe" C:UsersaylorAppDataLocalTemp\___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
    ", *p)

    执行结果 

    p = <nil>
    *p = 666
  • 相关阅读:
    css-深入理解margin和padding
    js的自定义事件
    jcFlexible.js的小Demo
    volatile关键字回顾
    threadLocalMap理解
    常用SQL笔记
    MyISAM和innoDB对比,覆盖索引简单回顾
    经典算法回顾:两个队列生成一个栈,两个栈生成一个队列
    Memcached与Redis对比,Redis基础笔记回顾
    ES(ElasticSearch)学习总结
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9534548.html
Copyright © 2011-2022 走看看