V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
hihanley
V2EX  ›  Go 编程语言

关于 Method 和 Function 的疑问

  •  1
     
  •   hihanley · 2021-10-03 14:10:22 +08:00 · 2392 次点击
    这是一个创建于 1180 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Go 语言中,有 Method: func (d Dog) Eat() 和和 Function: func Eat(d Dog),什么情况下该用哪个,有优先用哪个的约定吗?
    最近开发项目时,一个 struct 绑定的 method 越来越多,但是这个 method 又需要 struct 中的内容,所以产生了这个疑问。
    有的 method 需要在某个 method 调用之后才能调用,不写成文档,过一周自己都不明白逻辑。。。设计功力浅薄

    15 条回复    2021-10-17 01:41:10 +08:00
    masterclock
        1
    masterclock  
       2021-10-03 14:22:55 +08:00
    Method: func (d Dog) Eat() 狗吃
    Function: func Eat(d Dog) 吃狗肉?
    IndexOutOfBounds
        2
    IndexOutOfBounds  
       2021-10-03 14:40:09 +08:00   ❤️ 3
    Method 类比 Java 的 Method,Function 类比 Java 的 Static Method
    从面向对象的角度是尽量用 Method
    hihanley
        3
    hihanley  
    OP
       2021-10-03 15:58:03 +08:00
    @masterclock 哈哈,例子不太恰当
    cmdOptionKana
        4
    cmdOptionKana  
       2021-10-03 19:42:28 +08:00 via Android
    具体问题具体分析,怎么方便怎么来。另外,绑定一大堆 method 也没啥问题,别怕多。
    cmdOptionKana
        5
    cmdOptionKana  
       2021-10-03 19:46:53 +08:00 via Android   ❤️ 1
    “有的 method 需要在某个 method 调用之后才能调用”,这个只要加些防御代码,确保编译时会报错,也不算大问题。
    2i2Re2PLMaDnghL
        6
    2i2Re2PLMaDnghL  
       2021-10-03 23:24:49 +08:00   ❤️ 1
    golang 的 method 主要是多态吧。
    function 能 single dispatch 吗?
    lance6716
        7
    lance6716  
       2021-10-04 00:15:55 +08:00 via Android   ❤️ 1
    receiver 不是函数类型的一部分,所以某些需要特定类型函数的时候可以传 method
    hihanley
        8
    hihanley  
    OP
       2021-10-04 01:01:46 +08:00
    @cmdOptionKana
    > 这个只要加些防御代码,确保编译时会报错
    大佬,我初学 go,要怎么加防御代码让他编译报错,可以指点一下吗,或者给个关键字
    hihanley
        9
    hihanley  
    OP
       2021-10-04 01:03:48 +08:00
    @lance6716 呃,没有理解。。。“某些需要特定类型函数的时候可以传 method”
    phithon
        10
    phithon  
       2021-10-04 04:26:26 +08:00   ❤️ 1
    举个例子,如果你的项目里既有 Cat 又有 Dog 的情况下,就需要用`func (d Dog) Eat()`和`func (c Cat) Eat()`,因为 Go 不支持重载,不可能既有`func Eat(Dog dog)`又有`func Eat(Cat cat)`。
    wqtacc
        11
    wqtacc  
       2021-10-04 07:58:32 +08:00   ❤️ 1
    Go 中的方法函数实际上是个语法糖,在内部实现中,结构体或者指针就是它的第一个参数;至于一个方法要依赖另一个的问题,参考下 http 包中的 Request
    aliipay
        12
    aliipay  
       2021-10-05 12:17:11 +08:00
    ide 支持快速找到所有调用某个 method 的代码吗? 我用 goland 基本要几十秒,太难受了
    hihanley
        13
    hihanley  
    OP
       2021-10-07 01:44:54 +08:00
    @aliipay 可以的,几十秒有点离谱,是项目太大了么
    aliipay
        14
    aliipay  
       2021-10-08 13:26:28 +08:00
    @hihanley 有点大,但是也算不上太大吧
    husher123
        15
    husher123  
       2021-10-17 01:41:10 +08:00
    如果用 Method 是不是不方便 Mock,如果用 function,这个 function 可以属于某个 Adapter,然后可以方便的 Mock 这个 Adapter ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2612 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:37 · PVG 23:37 · LAX 07:37 · JFK 10:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.