go 的结构体方法为什么定义在结构体之外

2018-11-24 22:12:28 +08:00
 cc959798

感觉这样怪怪的,有点像 c++,但是 c++也是支持在类内核结构体内定义方法的,go 这样设计是为什么

1949 次点击
所在节点    问与答
9 条回复
Mohanson
2018-11-24 22:40:59 +08:00
你自己已经给出答案了,go 里面是“结构体”,c 草是“类”。 结构体是纯粹的数据结构,在数据结构里面定义“成员方法”是不合适的。你可以类比为 c 的结构体,只不过 go 提供了一个语法糖让你可以像操作类一样操作结构体。
niubee1
2018-11-24 22:47:07 +08:00
作者喜欢
cc959798
2018-11-24 22:53:27 +08:00
@Mohanson C++结构体和 class 几乎是一样的也可以加方法
Mohanson
2018-11-24 23:09:27 +08:00
@cc959798 一样的东西给了两个名字,本质更接近 class 而不是 c 的 struct. struct 可以通过网络传输,可以跨进程,class 则不行:怎么把成员函数也传过去?
Mohanson
2018-11-24 23:17:02 +08:00
go 里面回归 c 的设计,将数据结构和函数解绑,我觉得是非常高明的设计。包括 rust, 也是结构体和函数完全分开。
go 和 rust 这两门最新且最有人气的语言不约而同使用 c 的设计方式,我觉得侧面已经反映面向对象这种模式正在被现今的大佬们否定。
feverzsj
2018-11-24 23:22:57 +08:00
作者不懂这些
julyclyde
2018-11-25 08:44:33 +08:00
c++不是“支持在内定义”,而是“只能在内定义”
julyclyde
2018-11-25 08:45:08 +08:00
@Mohanson 为什么叫“回归 c 的设计”呢
c 里面对于 struct 的操作函数,并不是 struct 的一部分。在 go 里边,虽然是外定义,但还是强关联的
reus
2018-12-13 10:14:45 +08:00
type Foo int

func (f Foo) foo() {}

像这个 Foo 类型,你哪来个“内部”?

type 语句是给一个类型“命名”,而命名了的类型可以有方法。任意类型都能命名,所以有方法的,不一定都是结构体,像上面的 Foo 的基本类型是 int,它也可以有方法。

这是其他语言不具备的性质。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/511189

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX