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

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

  •  
  •   cc959798 · 2018-11-24 22:12:28 +08:00 · 1932 次点击
    这是一个创建于 1984 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    func (f Foo) foo() {}

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

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

    这是其他语言不具备的性质。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   805 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:43 · PVG 04:43 · LAX 13:43 · JFK 16:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.