为什么go函数的定义不同?

The*_*hat 2 go

我正在努力学习Go.当我以为我理解一个函数是什么,如何使用它并且想要进入接口时我就陷入了困境(来源 Go博客)

package main

import "fmt"

//define a Rectangle struct that has a length and a width
type Rectangle struct { 
   length, width int
}

//write a function Area that can apply to a Rectangle type
func (r Rectangle) Area() int {
   return r.length * r.width
}

func main() {
   r := Rectangle{length:5, width:3} //define a new Rectangle instance with values for its properties
   fmt.Println("Rectangle details are: ",r)  
   fmt.Println("Rectangle's area is: ", r.Area())
}
Run Code Online (Sandbox Code Playgroud)

为什么我们有 func (r Rectangle) Area() int没有func Area(r Rectangle) int?有什么不同吗?

Flo*_*yle 9

这意味着您的函数附加到类型.您可以为任何用户定义的类型执行此操作.区别在于您如何调用该函数,而不是使用:

a := Area(r);
Run Code Online (Sandbox Code Playgroud)

你会用:

a := r.Area();
Run Code Online (Sandbox Code Playgroud)

这也意味着如果你定义一个类似的方法

func (r Rectangle) String() string
Run Code Online (Sandbox Code Playgroud)

Rectangle将自动执行Stringer,您将获得打印的能力Rectangle.

  • 不,`Stringer`是界面的名称.任何带有`String()`方法的类型都有效地实现了Stringer. (2认同)