13 | 结构体及其方法的使用法门
13 | 结构体及其方法的使用法门
讲述:黄洲君
时长16:08大小5.54M
前导内容:结构体类型基础知识
问题解析
知识扩展
赞 27
提建议
精选留言(64)
- melon2018-09-10方法的定义感觉本质上也是一种语法糖形式,其本质就是一个函数,声明中的方法接收者就是函数的第一个入参,在调用时go会把施调变量作为函数的第一个入参的实参传入,比如 func (t MyType) MyMethod(in int) (out int) 可以看作是 func MyMethod(t Mytype, in int) (out int) 比如 myType.MyMethod(123) 就可以理解成是调用MyMethod(myType, 123),如果myType是*MyType指针类型,则在调用是会自动进行指针解引用,实际就是这么调用的 MyMethod(*myType, 123),这么一理解,值方法和指针方法的区别也就显而易见了。展开共 4 条评论123
- 来碗绿豆汤2018-09-11思考题1, 我们可以在结构体中嵌入某个类型的指针类型, 它和普通指针类似,默认初始化为nil,因此在用之前需要人为初始化,否则可能引起错误 思考题2, 空结构体不占用内存空间,但是具有结构体的一切属性,如可以拥有方法,可以写入channel。所以当我们需要使用结构体而又不需要具体属性时可以使用它。共 3 条评论57
- 风中花2019-07-17老师的专业术语用的啊,我能坚持到现在我也不容易啊 ,费劲啊 。共 10 条评论54
- 大马猴2018-12-17return a.AnimalCategory.String(),这叫链式表达式吗?这不就是普通的调用吗?老乱用概念,让人很难理解共 4 条评论32
- colben2018-09-11嘿嘿,看了郝老师的《go并发编程》,里面讲到空结构体类型变量不占内存空间,内存地址相同,建议用于在通道里传递“信号”……30
- Iflei2019-12-09一方面说go支持面向对象,一方面说go没有继承,这不很矛盾吗?面向对象三大特性之一就是继承,没有继承也敢叫面向对象。只是继承实现的方式不同罢了
作者回复: Go 是把多个编程范式有机地融合在一起了。继承其实是很容易引起程序复杂度飙升的一个东西。GoF 提倡的设计原则中也有“多用组合,少用继承”一条。这不正是 Go 所做的嘛?组合和继承是两个不同的东西,虽然它们在某些时候可以起到同样的作用。 我觉得纯粹的 OO 有利有弊,而且不能说没有完全实现OO 的所有思想就不算支持 OO。
共 6 条评论18 - colben2018-09-10go语言的结构体甚得我心!2009年我上大二学c++开始接触对象的概念,当时发现类的私有变量、成员函数完全可以用c的结构体配合函数指针来实现,完全没有必要去搞“类”!可惜后来的Java和python都没有摆脱class这个关键字,这次的go终于甩掉了臃肿的“对象”!共 1 条评论18
- 浩2019-08-13前面都看懂了,最后这里有疑问,老师开始说,值类型的方法由于是类型值的副本,所以不会对原数据修改,指针类型的方法由于是指针的副本,所以会对原数据修改,这里都没有问题,但是,老师又说值类型的方法运行时,会被go自动转译成(&cat).Setname(“newname”),那什么时候值类型会被转译呢
作者回复: 当值(比如这里说的cat)的方法集合中没有对应方法时,Go会去它的指针的方法集合中寻找,如果找到了,那么Go就会做这种转译。其他情况不会做转译。这属于一种语法糖,让我们能用同一种调用方式调用两种方法(值方法或指针方法)。
共 2 条评论16 - 🐶2019-08-111. 可以嵌入某个类型的指针类型,包括本结构体的指针类型,例如树的结构体的声明。但是在使用之前需要初始化 2. struct{}代表是一个空结构体,不占用内存空间,但是也是一个结构体!
作者回复: 嗯,对。
共 2 条评论14 - 卡卡爱漂流2018-09-28如果一个method的receiver是*T,你可以在一个T类型的实例变量V上面调用这个method,而不需要&V去调用这个method; 如果一个method的receiver是T,你可以在一个*T类型的变量P上面调用这个method,而不需要 *P去调用这个method。 所以,不用担心你是调用的指针的method还是不是指针的method,Go知道你要做的一切展开10
- Q卓玛的男人2018-09-11感觉值方法修改的只是类型值的副本,这个很容易弄错误认为已经更新了类型值本身。那么如果我们定义方法都定义为指针方法,而不用值方法,会有什么问题吗?共 1 条评论10
- 苏浅2018-09-10每篇文章都有一个配图,这是有啥讲究吗?还是就是觉得好看?😏共 1 条评论8
- ossic2018-09-10貌似github上的代码并没有更新8
- 杉松壁2020-06-17老师,闭包我还是没能理解。 既然是内层的函数需要op的传值,为什么不能直接将op直接传给内层函数,而要通过外层函数的封装?
作者回复: 内层函数相当于一种函数的不完整定义,外层函数相当于制造这种函数(即完整后的内层函数)的工厂。当你调用外层函数并传入参数值时,相当于在告诉外层函数“根据我给定的参数制造出一个函数”。你想想看,这实际上是在程序的运行过程中动态的生成代码(而不是数据),与创建一个值、一个数据结构的实例是截然不同的。 这里的代码不是死的,而是活的。这也可以被看作是一种简易的元编程。
7 - Yayu2018-09-18第二次学习本章节,对老师讲解的内容有了清晰的认识。回答一下老师的问题。1.一个结构体可以嵌入一个类型的指针类型,而且被嵌入的类型还可以是它自己,这样可以构造出树的数据结构。2.struct{}是一个空结构体字面量表示,它可以用来给一个变量赋值,这个变量虽然没有字段,但是可以绑定方法。5
- 风一般的梦幻2019-10-30Effective GO中一句话“还有种区分内嵌与子类的重要手段。当内嵌一个类型时,该类型的方法会成为外部类型的方法, 但当它们被调用时,该方法的接收者是内部类型,而非外部的。”可以帮助大家理解组合和继承的区别4
- 夏云2018-09-30这一讲概念性的文字太多,多一些例子就好了,不然第一遍云里雾里的
作者回复: 可以对照着示例项目中的代码看,实际上我也是这么设计的。另外,这个专栏的定位也不是只讲浅显的东西。一些核心的东西需要大家仔细研习,反复琢磨。想当初我也是这么做的。我希望这些内容能给你们带来长期的好处。 听音频可以让你们有个宏观的了解和大概的感觉,真正学起来还是需要看文字、看代码的。加油!
4 - 风一般的梦幻2019-10-30这句话“同时,类型组合也是非侵入式的,它不会破坏类型的封装或加重类型之间的耦合。”能否和Java对比举例说明一下呢?
作者回复: 看过设计模式的书吗?其中有一条原则:多用组合,少用继承。这样才能低耦合。另外可以结合“组合模式”思考一下。
3 - Sky2019-07-01函数是独立的程序实体。这一段的表述,有点让人疑惑“函数”和“方法”到底有什么区别?从代码上看,如果没有“接收者类型”,函数和方法是完全一样的。方法如果没有“接收者类型”,那么它就是“函数”,为什么这里说“方法必须隶属于某一个类型”。
作者回复: 方法的声明形式是:func (xx XX) methodName() {...},其中的 (xx XX) 是接收者声明。这个接收者就是某个类型 XX 啊,xx 是它被实例化后的指代变量。XX 叫接收者类型,xx 叫接收者变量。这就是方法与函数的区别啊。方法必须依附于某个类型,而函数不用,函数是独立的。调用方法的话,只能通过该方法依附的那个类型的某个实例去调用,比如:xx1.methodName()。而函数可以直接调用。 这些在你问的问题里基本都表述出来了。你没有察觉到吗?
3 - manky2018-09-14严格来讲,我们在这样的基本类型的值上只能调用到它的值方法。但是go语言会适时地进行转义.请问什么时候不会出现转义,或者说编译器进行转义有什么必备条件吗?
作者回复: 在基本值上调用它的指针方法时Go会先对基本值进行取址再调用它的指针方法,这就是我说的转义。
3