1.1 什么是方法
Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集
方法只是一个函数,它带有一个特殊的接收器类型,它是在func关键字和方法名之间编写的。接收器可以是struct类型或非struct类型。接收方可以在方法内部访问。
方法能给用户自定义的类型添加新的行为。它和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法。接收者可以是值接收者,也可以是指针接收者。
在调用方法的时候,值类型既可以调用值接收者的方法,也可以调用指针接收者的方法;指针类型既可以调用指针接收者的方法,也可以调用值接收者的方法。
也就是说,不管方法的接收者是什么类型,该类型的值和指针都可以调用,不必严格符合接收者的类型。
1.2 方法的语法
定义方法的语法
func (t Type) methodName(parameter list)(return list) {}func funcName(parameter list)(return list){}实例代码:
package mainimport ( "fmt")type Employee struct { name string salary int currency string}func (e Employee) displaySalary() { fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary)}func main() { emp1 := Employee { name: "Sam Adolf", salary: 5000, currency: "$", } emp1.displaySalary() //Calling displaySalary() method of Employee type}可以定义相同的方法名
示例代码:
package mainimport ( "fmt" "math")type Rectangle struct { width, height float64}type Circle struct { radius float64}func (r Rectangle) area() float64 { return r.width * r.height}//该 method 属于 Circle 类型对象中的方法func (c Circle) area() float64 { return c.radius * c.radius * math.Pi}func main() { r1 := Rectangle{12, 2} r2 := Rectangle{9, 4} c1 := Circle{10} c2 := Circle{25} fmt.Println("Area of r1 is: ", r1.area()) fmt.Println("Area of r2 is: ", r2.area()) fmt.Println("Area of c1 is: ", c1.area()) fmt.Println("Area of c2 is: ", c2.area())}运行结果
Area of r1 is: 24Area of r2 is: 36Area of c1 is: 314.1592653589793Area of c2 is: 1963.4954084936207
虽然method的名字一模一样,但是如果接收者不一样,那么method就不一样method里面可以访问接收者的字段调用method通过.访问,就像struct里面访问字段一样



