Golang Go语言中关于 Method 和 Function 的疑问

发布于 1周前 作者 caililin 来自 Go语言

Golang Go语言中关于 Method 和 Function 的疑问

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


更多关于Golang Go语言中关于 Method 和 Function 的疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

16 回复

Method: func (d Dog) Eat() 狗吃
Function: func Eat(d Dog) 吃狗肉?

更多关于Golang Go语言中关于 Method 和 Function 的疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Method 类比 Java 的 Method,Function 类比 Java 的 Static Method
从面向对象的角度是尽量用 Method

哈哈,例子不太恰当

具体问题具体分析,怎么方便怎么来。另外,绑定一大堆 method 也没啥问题,别怕多。

“有的 method 需要在某个 method 调用之后才能调用”,这个只要加些防御代码,确保编译时会报错,也不算大问题。

golang 的 method 主要是多态吧。
function 能 single dispatch 吗?

receiver 不是函数类型的一部分,所以某些需要特定类型函数的时候可以传 method


> 这个只要加些防御代码,确保编译时会报错
大佬,我初学 go,要怎么加防御代码让他编译报错,可以指点一下吗,或者给个关键字

呃,没有理解。。。“某些需要特定类型函数的时候可以传 method”

举个例子,如果你的项目里既有 Cat 又有 Dog 的情况下,就需要用func (d Dog) Eat()func (c Cat) Eat(),因为 Go 不支持重载,不可能既有func Eat(Dog dog)又有func Eat(Cat cat)

Go 中的方法函数实际上是个语法糖,在内部实现中,结构体或者指针就是它的第一个参数;至于一个方法要依赖另一个的问题,参考下 http 包中的 Request

ide 支持快速找到所有调用某个 method 的代码吗? 我用 goland 基本要几十秒,太难受了

可以的,几十秒有点离谱,是项目太大了么

有点大,但是也算不上太大吧

如果用 Method 是不是不方便 Mock,如果用 function,这个 function 可以属于某个 Adapter,然后可以方便的 Mock 这个 Adapter ?

在Golang(Go语言)中,Method(方法)和Function(函数)虽然都是实现特定功能的代码块,但它们之间存在一些关键差异。

  1. 接收者:最显著的区别在于方法有一个接收者(receiver),而普通函数没有。方法的接收者可以是值接收者或指针接收者,它决定了方法内部是否能修改接收者指向的值。例如,func (r ReceiverType) MethodName(params) ReturnType 定义了一个值接收者的方法,而 func (r *ReceiverType) MethodName(params) ReturnType 则定义了一个指针接收者的方法。

  2. 调用方式:方法通过接收者实例调用,如 instance.MethodName(params),而函数则直接通过包名或函数名调用,如 PackageName.FunctionName(params)FunctionName(params)

  3. 类型绑定:方法是类型的一部分,可以针对特定类型定义方法,使得该类型具有更丰富的行为。而函数是独立的,不与特定类型绑定。

  4. 实现接口:在Go中,只有方法(而非函数)可以被用来实现接口。这意味着,如果你希望一个类型满足某个接口,你需要为该类型定义方法。

总的来说,方法和函数在Go语言中扮演着不同的角色,理解它们之间的差异对于编写高效、可维护的Go代码至关重要。希望这能帮助你澄清关于Method和Function的疑问!如果有更多具体问题,欢迎继续提问。

回到顶部