首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
V2EX  ›  问与答

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

  •  
  •   cc959798 · 55 天前 · 661 次点击
    这是一个创建于 55 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    func (f Foo) foo() {}

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

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

    这是其他语言不具备的性质。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2196 人在线   最高记录 4236   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 15ms · UTC 14:36 · PVG 22:36 · LAX 06:36 · JFK 09:36
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1