• 郝林 置顶
    2019-06-03
    大家可以具体说说有哪些名词需要用示例解释?
    
     2
  • sun
    2018-09-17
    在描述不可寻址那部分有很多名词,要是能分别有段示例一下就好了,对照起来会更清晰
    
     37
  • 江山如画
    2018-09-17
    引用类型的指针值有意义。

    以切片为例:fmt.Printf("%p\n", sli) 和 fmt.Printf("%p\n", &sli[0]) 打印的都是底层数组元素的地址。
    而 fmt.Printf("%p\n", &sli) 打印的是切片结构体的内存地址,验证代码如下:

    arr := [3]int{1, 2, 3}
    fmt.Printf("%p\n", &arr) //0xc0000161e0

    sli := arr[:]
    fmt.Printf("%p\n", sli) //0xc0000161e0
    fmt.Printf("%p\n", &sli[0]) //0xc0000161e0

    fmt.Printf("%p\n", &sli) //0xc00000a080
    fmt.Println(unsafe.Pointer(&sli)) //0xc00000a080

    sliHeader := (*reflect.SliceHeader)(unsafe.Pointer(&sli))
    fmt.Printf("0x%10x\n", sliHeader.Data) //0xc0000161e0

    可以看到,使用 %p 打印地址的时候:&sli 和 unsafe.Pointer(&sli) 都指向了切片结构体的地址,&arr,sli ,&sli[0],sliHeader.Data 都指向了底层数组。
    展开
     1
     16
  • jacke
    2018-10-13
    字面量有人理解吗?求解释

    作者回复: 说白了就是用于表示值或者类型的代码段。比如:1234就是代表整数值的字面量,int64就是代表类型的字面量。很简单,不用想的太复杂。

    
     10
  • nuczzz
    2018-11-16
    get新技能: unsafe.Pointer+ uintptr突破私有成员访问!
    
     9
  • 乖,摸摸头
    2019-11-19
    云里雾里,我在这里懵逼等你,我肯定懵逼的不只我一个
    
     7
  • 后端进阶
    2018-09-14
    既然知道dogPtr,那么必然也知道dogP的值,也就是可以通过dogP去那name的值了,不是很理解
     1
     6
  • 静水流深
    2019-07-18
    老师您好,引用类型的值的指针值,是否可以理解为指针的指针?

    作者回复: 你最好不要这么理解,否则会影响其他地方的理解。引用类型的值不是指针那么简单,它本身是有结构的,所以还是要按普通的值来理解,不要理解成指针。

    
     3
  • 有铭
    2018-09-14
    C里的指针是用来直接操作内存的,因为C里有大量的操作是必须靠操作内存完成的。那么go这种带有GC,不需要手动分配内存的语言,指针存在的意义在哪里呢,Go里的指针在何时有“不得不使用”的意义呢?

    作者回复: 没有非得使用的必要。指针类型及其值最常用,因为可以达到传址的效果。

     1
     3
  • Geek_a8be59
    2019-07-02
    根据您说的 由于 Go 语言中的字符串值也是不可变的
        var a = "123"
             var c = "123"
        fmt.Printf("a fist is %p\n",&a)
        a = "456"

        fmt.Printf("a two is %p \n",&a)
        b:=a
        fmt.Printf("a three is %p \n",&a)
        fmt.Printf("b is %p \n",&b)
    我想问的是
    ①这里的“123”和“456”值不可变,那是不是他们两个都是在常量区呢?我不清楚是不是有go有常量区这②如果字符串的值是不可变的,那么c和a的字符串的值的地址是一样的呢?
    ③那为什么&a != & c呢,这里是取的字面量a的地址么?是不是可以理解成*a才是真正字符串“123”的地址呢
    展开

    作者回复: 1. Go 语言没有常量区这个概念。
    2. 你要分清楚变量和值啊。变量本身的存储中包含了值,但不限于值。变量可以拥有或者代表一个值,但是它本身并不是值啊。
    3. 你无法获取值 "123" 和 "456" 本身的存储地址,因为 Go 语言规范规定这样的值本身是不可取址的。

    你可以参考 Go 运行时系统中对 string 结构的定义:

    type stringStruct struct {
        str unsafe.Pointer
        len int
    }

    这个声明所在文件的路径是:/src/runtime/string.go 。


    
     2
  • 猫王者
    2018-10-09
    go语言的引用类型本质还是结构体,包括切片,字典还有接口,底层都是用结构体来实现,引用类型的地址就是这个底层结构体的地址吧
    
     2
  • 高鸿祥
    2018-09-24
    动态语言过来的人表示看不懂😁
    
     2
  • Alan
    2020-01-02

    New("little pig").SetName("monster")
    这个应该看版本的吧,在1.13.5版本中是可以的

    作者回复: 这个是基本的规则,哪个版本都是一样的。

     1
     1
  • 党
    2019-07-26
    引用类型的指针意义非常大,前边说过变量的赋值都是拷贝,是副本,对于结构体类型数据也是如此,你对一个结构体数据进行数据修改也是对副本进行修改,不会真的修改成功,但是要有引用就可以实现修改目的了
    
     1
  • benying
    2019-06-03
    目前为止看到最费劲的一章,指针确实费劲,O(∩_∩)O哈哈~

    作者回复: 加油!

    
     1
  • Laughing
    2018-10-05
    引用类型的值的指针,还是主要用于指针传递吧,比如做一些引用类型的复制?
    
     1
  • Michael
    2018-09-17
    “引用类型的值得指针值” 同C语言中 “指针的指针” 应该是一个概念;

    假设,有一个值类型 T,那么类型T的引用类型就是:*T,引用类型值得指针值类型就是:**T。

    var t = T{} // T
    var pt = &T // *T
    var ppt = &pt // **T

    但是具体的意义与使用场景还没想到,也没有遇到过,若老师不嫌弃,还请老师指出
    展开

    作者回复: 在Go需要中所谓的指针的指针最好不要用,Go也是想避免这种复杂性才搞出来引用类型的。

    
     1
  • Realm
    2018-09-14
    1 “引用类型的值的指针 ”与 “引用类型的值的值指针”是两个概念?

    2 值的值指针是类似切片、字典、通道内的元素的指针吗?

    如果是,那老师的思考题,引用类型的值的值指针的意义:是不是用此指针来取元素的值?

    作者回复: 我没说过“值指针”这个词。“引用类型的值的指针值”的含义你不理解还是?

    
     1
  • undifined
    2018-09-14
    老师 有一点没有理解,namePtr := dogPtr + unsafe.Offsetof(dogP.name)这里如果不知道这个属性是什么,怎么才能取到这个字段的便宜量呢

    作者回复: 不知道?不知道就没法取了。

    
     1
  • 水先生
    2020-01-03
    结合demo代码一起看,十分利于学习和理解!辛苦老师在里面加了这么多注释。
    
    
我们在线,来聊聊吧