关于 Method 和 Function 的疑问

2021-10-03 14:10:22 +08:00
 hihanley

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

2392 次点击
所在节点    Go 编程语言
15 条回复
masterclock
2021-10-03 14:22:55 +08:00
Method: func (d Dog) Eat() 狗吃
Function: func Eat(d Dog) 吃狗肉?
IndexOutOfBounds
2021-10-03 14:40:09 +08:00
Method 类比 Java 的 Method,Function 类比 Java 的 Static Method
从面向对象的角度是尽量用 Method
hihanley
2021-10-03 15:58:03 +08:00
@masterclock 哈哈,例子不太恰当
cmdOptionKana
2021-10-03 19:42:28 +08:00
具体问题具体分析,怎么方便怎么来。另外,绑定一大堆 method 也没啥问题,别怕多。
cmdOptionKana
2021-10-03 19:46:53 +08:00
“有的 method 需要在某个 method 调用之后才能调用”,这个只要加些防御代码,确保编译时会报错,也不算大问题。
2i2Re2PLMaDnghL
2021-10-03 23:24:49 +08:00
golang 的 method 主要是多态吧。
function 能 single dispatch 吗?
lance6716
2021-10-04 00:15:55 +08:00
receiver 不是函数类型的一部分,所以某些需要特定类型函数的时候可以传 method
hihanley
2021-10-04 01:01:46 +08:00
@cmdOptionKana
> 这个只要加些防御代码,确保编译时会报错
大佬,我初学 go,要怎么加防御代码让他编译报错,可以指点一下吗,或者给个关键字
hihanley
2021-10-04 01:03:48 +08:00
@lance6716 呃,没有理解。。。“某些需要特定类型函数的时候可以传 method”
phithon
2021-10-04 04:26:26 +08:00
举个例子,如果你的项目里既有 Cat 又有 Dog 的情况下,就需要用`func (d Dog) Eat()`和`func (c Cat) Eat()`,因为 Go 不支持重载,不可能既有`func Eat(Dog dog)`又有`func Eat(Cat cat)`。
wqtacc
2021-10-04 07:58:32 +08:00
Go 中的方法函数实际上是个语法糖,在内部实现中,结构体或者指针就是它的第一个参数;至于一个方法要依赖另一个的问题,参考下 http 包中的 Request
aliipay
2021-10-05 12:17:11 +08:00
ide 支持快速找到所有调用某个 method 的代码吗? 我用 goland 基本要几十秒,太难受了
hihanley
2021-10-07 01:44:54 +08:00
@aliipay 可以的,几十秒有点离谱,是项目太大了么
aliipay
2021-10-08 13:26:28 +08:00
@hihanley 有点大,但是也算不上太大吧
husher123
2021-10-17 01:41:10 +08:00
如果用 Method 是不是不方便 Mock,如果用 function,这个 function 可以属于某个 Adapter,然后可以方便的 Mock 这个 Adapter ?

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

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

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

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

© 2021 V2EX