go new make用法, nil赋值

package main

import "fmt"

func main()  {
    //new返回指针
    p1 := new(int)    //分配一个地址空间,new函数会返回地址p1,并会初始化值为0(类型的空值),地址指向(引用)的值可变
    fmt.Printf("p1 --> %#v \n ", p1)  //nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果将nil赋值给其他变量的时候将会引发panic
    fmt.Printf("p1 point to --> %#v \n ", *p1)
    *p1 = 10
    fmt.Printf("p1 --> %#v \n ", p1)
    fmt.Printf("p1 point to --> %#v \n ", *p1)
    var p2 *int
    fmt.Printf("p2 --> %#v \n ", p2)    //即没有分配地址空间,不能引用
    //fmt.Printf("p2 point to --> %#v \n ", *p2) //空指针的引用会导致编译错误

    var p3 *int         //即没有分配地址空间,不能引用
    j := 5
    jj := 10
    p3 = &j             //此时,p3指向地址,可以引用
    fmt.Printf("p2 --> %#v \n ", p3)  //0xc0420620b8
    fmt.Printf("p2 point to --> %#v \n ", *p3) //5
    p3 = &jj
    fmt.Printf("p3 --> %#v \n ", p3)   //0xc0420620c0
    fmt.Printf("p3 point to --> %#v \n ", *p3) //golang中变量初始化分配内存地址,j的地址没有指针指向,0xc0420620b8地址指向的值暂时无法改变

    var t int
        fmt.Printf("t address --> %#v \n ", &t)   //0xc042008110 由此可知,变量定义是会初始化地址,而且会赋予类型零值,
        fmt.Printf("t value is --> %#v \n ", t)
    t = 10
    fmt.Printf("t --> %#v \n ", &t)   //t 是0xc042008110指向值的引用,要使函数活方法中改变外部变量的值,必须传递指针,否则改变都是局部变量地址指向的值
    fmt.Printf("t value now --> %#v \n ", t)

    changeInt(t)
    //x := 11
    //&t = &x    //指针不能运算

    //make 用法,只能用于slice,map,channel,可用nil赋值
    var s1 []int

    if s1 == nil {    //未初始化
        fmt.Printf("s1 address  --> %#v \n ", &s1)
        fmt.Printf("s1 is nil --> %#v \n ", s1) // []int(nil)
    }
    s2 := make([]int,3)    // 返回的是引用类型,即可在函数中直接改变s2的值
    if s2 == nil {   //地址不为空,等号不成立
        fmt.Printf("s2 is nil --> %#v \n ", s2)
    } else {   //初始化后,分配地址空间
        fmt.Printf("s2 address  --> %#v \n ", &s2)
        fmt.Printf("s2 is not nil --> %#v \n ", &s2[0])// 0xc0420600c0
        fmt.Printf("s2 is not nil --> %#v \n ", &s2[1])// 0xc0420600c8
        fmt.Printf("s2 is not nil --> %#v \n ", s2)// []int{0, 0, 0}
    }
    changeSlice(s2)

}

func changeSlice(s []int) {
    fmt.Printf("s[0] address  --> %#v \n ", &s[0]) //0xc0420600c0   地址相同,说明是地址传递,map channel 逻辑相同,golang源码中实现的逻辑
    s[0] = 5

}
func changeInt(s int) {
    fmt.Printf("t in func address  --> %#v \n ", &s)
    s = 5
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容