golang函数定义时,函数名前加括号是指的强制转换吗?这个有什么用处?

这样写是什么意思?

type Encrypt struct{}

func (*Encrypt) EncodeMd5(buf []byte) string {
    hash := md5.New()
    hash.Write(buf)
    return hex.EncodeToString(hash.Sum(nil))
}

函数EncodeMd5前面加(*Encrypt) 有什么作用呢?

我知道type Encrypt struct{}是定义一个结构体。

阅读 6.2k
3 个回答
新手上路,请多包涵

相当于Java中的方法(Java中的方法和函数是不同的)

给"Encrypt " 这个结构体实现一个方法

新手上路,请多包涵

你好,GO 是类C语言,也就是面向过程语言。见此
以C语言为例,它是没有类这种概念的,只有结构体。
在C中,编写一个结构体的方法,我们通常采用以下写法:

void func(s *Student,id int){
...
}

把第一个参数做为该方法的“类对象”,也称为接受者,receiver
Go只是把C语言中的第一个参数放到方法前面而已,所以它并不是用来类型转换的,而是一个接收者,说明该方法属于哪个结构体。

你有可能会好奇接收器该不该加星号?
也就是方法的接收器什么时候适合是指向结构体的指针而不是结构体值。

你可以点击之前的链接,官方文档里说得很详细了。我这里简单概括下,还是以C语言为例,我们知道在C中如果对一个指针变量进行修改,那么它的“副本”们也都会被修改。
所以在Go中,

  • 如果你的方法是需要对结构体本身修改的,请使用指针作为接收器。否则,以值为接收器,改动将无效(类似slice,map特殊结构体)。
  • 你的结构体很大,用一个指针传递,会节约资源。
  • 为统一起见,如果你的大多方法以指针为接收器,请把其他方法也优先以指针作为接收器,不然调用时可能会提示该方法不属于某结构体的乌龙错误。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题