• ddh
    2021-12-08
    思考题解答: 由 *field 改为 field结果正确的原因是, *field的方法的第一个参数是*field, 这个对于[]*field数组直接传入成员就可以了, 而对于[]field数组, 则是要取地址,也就是指针。 但是这个指针指的是for range 循环的局部变量的地址, 这个地址在for 循环中是不变的, 在for循环结束后这个地址就指向了最后一个元素, goroutine真正实行打印的解引用的地址是局部变量的地址, 自然只会打印最后一个元素了 field 的方法, 不涉及引用, 传参都是拷贝复制

    作者回复: 👍

    共 3 条评论
    50
  • 每天晒白牙
    2022-07-15
    go方法的本质是一个以方法的 receiver 参数作为第一个参数的普通函数 函数是第一等公民,那大家都写函数就行了,方法存在的意义是啥呢?

    作者回复: 你这个问题很好👍。 我可以将其转换为另外一个几乎等价的问题:我们知道c++的方法(成员函数)本质就是以编译器插入的一个this指针作为首个参数的普通函数。那么大家为什么不直接用c的函数,非要用面向对象的c++呢? 其实你的问题本质上是一个编程范式演进的过程。Go类型+方法(类比于c++的类+方法)和oo范式一样,是一种“封装”概念的实现,即隐藏自身状态,仅提供方法供调用者对其状态进行正确改变操作,防止其他事物对其进行错误的状态改变操作。

    共 2 条评论
    17
  • Calvin
    2021-12-08
    思考题,reciever是 field 值类型非 *field 指针类型,转换后的方法表达式如下: 1) field.print(*v) 2) field.print(v) 打印的都是切片的元素的值。

    作者回复: 👍

    共 2 条评论
    16
  • 左耳朵东
    2021-12-11
    如果 print 方法的 receiver 类型为 field: 首先,两个 for range 循环中的 go v.print() 分别等同于 go field.print(*v) 和 go field.print(v), 然后,第一个 for range 循环,用 *field 去调用 print 方法时,编译器检测到 print 方法只接受 field 值类型参数,所以自动做了隐式类型转换,转成 *v 后传入 print 方法 可以看到两个 for range 中实际传到 print 的实参都是 field 值类型而非指针类型,所以就得到了预期结果

    作者回复: 👍

    共 3 条评论
    15
  • 罗杰
    2021-12-08
    老师在我心目中就是 “Go 语言百科全书”。

    作者回复: 这.... :)

    
    13
  • 进化菌
    2021-12-08
    *field 改为 field,由指针类型变成普通类型。goroutine在编译的时候就初始化了变量吧,那么指针类型的自然会随着变化而变化,普通类型被值拷贝而不会发生变化。 * 和 & 都是值得花时间学习和理解的东西,不知道老师后面会不会特别的说一下呢?

    作者回复: 指针在Go中被弱化,所以我在设计大纲时没有特意为之留出章节,如果大家有这方面的想法,我和编辑老师看看是否可以在加餐中补充一下。但可能要放在后面了

    共 2 条评论
    9
  • aoe
    2021-12-10
    一直以为 func 开头的就是方法,原来还分函数和方法!我对方法的理解: 1. 提供了良好的封装,receiver 限定了使用对象,方法名可以表使用达对象可以提供的行为 2. 使用起来更方便简洁,因为可以少传一个参数 3. Go 语言设计者的思维真是缜密啊,“方法声明必须与 receiver 参数的基类型在同一个包中”这个规则解决了无数可能出现的奇奇怪怪的情况 4. 可以促进包中代码功能的高内聚,因为你出了包,定义方法时会受到限制,可以及时发现:哎呀,有问题

    作者回复: 👍

    共 2 条评论
    6
  • Roway
    2022-07-07
    *T &T T _ 这四个分别是什么意思?还有哪些基本的概念

    作者回复: T泛指一个go类型 *T 是T类型的指针类型 &T{} 返回一个T类型实例的指针 _ 是go语法中的空标识符

    
    4
  • Geek_7254f2
    2022-02-17
    建议老师把data1 := []*field{{"one"}, {"two"}, {"three"}}和data2 := []field{{"four"}, {"five"}, {"six"}}其中data1和date2中[]*、[]类型的区别讲一下,就好理解了。特别是还有*[]类型,这三个类型很像,很容易混淆

    作者回复: 好建议👍,感谢。

    共 2 条评论
    4
  • Untitled
    2022-02-10
    receiver 参数的基类型本身不能为指针类型或接口类型?? *T不是指针类型吗?不理解

    作者回复: T是基类型,说的是T本身不能为指针类型。 type T *int func (T) M1() {} // invalid receiver type T (pointer or interface type)

    
    4