Avatar ·

奇怪的Go语法:函数名前的括号是什么意思?

大家好!我刚开始在Python和JavaScript之后学习Go,有一种语法特性让我感到困惑。在代码中,我经常看到类似这样的内容: ```go type Rectangle struct { Width float64 Height float64 } func (r Rectangle) Area() float64 { return r.Width * r.Height } ``` 为什么在函数名 `Area` 前面有括号 `(r Rectangle)`?在Python中,我只会写 `def area(self):`。我理解这与结构体的方法有关,但无法理解其逻辑。 还有一个例子让我困惑: ```go func (p *Person) SetName(name string) { p.Name = name } ``` 为什么有时写 `(p *Person)`,有时写 `(p Person)`?如果我完全去掉这些括号会怎样?例如: ```go func Area() float64 { return 0 } ``` 这样也能工作。什么时候需要使用这种语法,什么时候不需要?请像对新手一样解释一下。我觉得我错过了Go的某个基本概念。提前感谢你的帮助。