方法
基本理解
方法就是一个函数,但是指定了调用的类型。它带有一个特殊的接收器类型。只有指定类型才可调用。很方便,定义了就能用
基本语法
实例代码就是
package main
import (
"fmt"
)
//创建结构体
type Employee struct {
name string
salary int
currency string
}
//在这里指定该函数必须是Employee才可调用
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: "$",
}
//通过"."来掉用displaySalary方法
emp1.displaySalary()
}
属性
属性一
可以定义相同的方法名
可调用的类型不一致,可以定意相同的方法名
例如
func (r Rectangle) area() float64 {
return r.width * r.height
}
func (c Circle) area() float64 {
return c.radius * c.radius * math.Pi
}
属性二:
方法里面可以访问接收者的属性
就像struct访问字段一样
方法的继承
和java中的继承不太一样,go并不支持类,继承关系发生在匿名结构体中
例如
package main
import "fmt"
//这里的Human就类似java中的父类
type Human struct {
name string
age int
phone string
}
//以下的两个结构体就类似Java中的子类
type Student struct {
Human //匿名字段
school string
}
type Employee struct {
Human //匿名字段
company string
}
//相当于是父类中的方法
func (h *Human) SayHi() {
fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}
func main() {
mark := Student{Human{"Mark", 25, "222-222-YYYY"}, "MIT"}
sam := Employee{Human{"Sam", 45, "111-888-XXXX"}, "Golang Inc"}
//两个匿名结构体都可调用SayHi方法
mark.SayHi()
sam.SayHi()
}
例如
为什么要使用方法
1.虽然可以使用函数来解决方法可以解决的问题,但是go语言不支持类,而方法是一种类似于类的行为的方法
2.方法可以重复定义而函数不可以
3.方法中有类似继承关系的用法存在
总之,个人感觉,因为go语言不支持类,为了解决这一个根本性的问题添加了方法机制