zoukankan      html  css  js  c++  java
  • golang 基础知识6

    1.如果map的一个属性是strct,要修改这个strct的属性值得方法:

    type S struct {
      name string
    }

    func main() {

      m := map[string]*S{"x": &S{"one"}}        
      m["x"].name = "two"
      fmt.Println(m["x"])

    }

    补充一下 * &的知识:

    解释

    理论

    &符号的意思是对变量取地址,如:变量a的地址是&a 
    *符号的意思是对指针取值,如:*&a,就是a变量所在地址的值,当然也就是a的值了

    简单的解释

    *和 & 可以互相抵消,同时注意,*&可以抵消掉,但&*是不可以抵消的 
    a*&a是一样的,都是a的值,值为1 (因为*&互相抵消掉了) 
    同理,a*&*&*&*&a是一样的,都是1 (因为4个*&互相抵消掉了)

    展开

    因为有 
    var b *int = &a 
    所以 
    a*&a*b是一样的,都是a的值,值为1 (把b当做&a看)

    再次展开

    因为有 
    var c **int = &b 
    所以 
    **c**&b是一样的,把&约去后 
    会发现**c*b是一样的 (从这里也不难看出,*cb也是一样的) 
    又因为上面得到的*&a*b是一样的 
    所以 
    **c*&a是一样的,再次把
    &约去后 
    **ca是一样的,都是1

    不信你试试?

    公布结果

    运行的结果内的地址值(0xc200开头的)可能会因不同机器运行而不同,你懂的

    $ go run main.go 
    a     =     1
    &a     =     0xc200000018
    *&a     =     1
    b     =     0xc200000018
    &b     =     0xc200000020
    *&b     =     0xc200000018
    *b     =     1
    c     =     0xc200000020
    *c     =     0xc200000018
    &c     =     0xc200000028
    *&c     =     0xc200000020
    **c     =     1
    ***&*&*&*&c     =     1
    x     =     1

    两个符号抵消顺序

    *&可以在任何时间抵消掉,但&*不可以被抵消的,因为顺序不对

    fmt.Println("*&a	=	",*&a)  //成功抵消掉,打印出1,即a的值
    fmt.Println("&*a	=	",&*a)  //无法抵消,会报错
  • 相关阅读:
    c语言,浮点数转byte array
    go的select 只会执行一个case,就会退出select 块
    【转】pphp中goto的用法
    [转]php 中yield是个什么东西
    z-index 0 和auto的区别,这个例子好好琢磨一下
    SpringMVC框架下实现原生分页功能
    Jackson 高级应用
    Jackson 的 基本用法
    Jackson转换为Collection、Array
    spring处理数据库中Date类型字段转换成时间戳问题
  • 原文地址:https://www.cnblogs.com/jay--zhang/p/8268178.html
Copyright © 2011-2022 走看看