go之方法
什么是方法
方法其实就是一个函数,在func这个关键字和方法名中间加入一个特殊的接收器类型,接收器可以是结构体类型或者是非结构体类型,接收器是可以在方法的内部访问的
方法的结构
func (接收器) 方法名(参数1 参数类型,参数2 参数类型)(返回值){ 内容 }
定义方法
package main import ( "fmt" ) type Employee struct { name string salary int currency string } /* displaySalary() 方法将 Employee 做为接收器类型 */ func (e Employee) displaySalary() { fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary) //Salary of Sam Adolf is $5000 } func main() { emp1 := Employee { name: "Sam Adolf", salary: 5000, currency: "$", } emp1.displaySalary() // 调用 Employee 类型的 displaySalary() 方法 }
在上面程序的第 16 行,我们在 Employee
结构体类型上创建了一个 displaySalary
方法。displaySalary()方法在方法的内部访问了接收器 e Employee
。在第 17 行,我们使用接收器 e
,并打印 employee 的 name、currency 和 salary 这 3 个字段。
在第 26 行,我们调用了方法 emp1.displaySalary()
。
程序输出:Salary of Sam Adolf is $5000
。
package main import "fmt" type Dog struct { Name string Age int } func (self Dog)Speak() { fmt.Println("我是狗狗:",self.Name,"我说话了") } func main() { var dog =Dog{"二哈",2} dog.Speak() }
有了函数,为什么还要方法
函数有几个值就要传几个,不能自动传值
方法绑定给结构体,拿到结构体对象直接调用即可,不需要再传参数
值接收器
修改不会影响原来的
package main import "fmt" type Dog struct { Name string Age int } func (dog Dog)changeName(name string) { dog.Name=name fmt.Println("方法中改了名字,",dog) //方法中改了名字, {牧羊犬 2} } func main() { var dog =Dog{"二哈",2} dog.changeName("牧羊犬") fmt.Println(dog) // {二哈 2} }
指针类型接收器
package main import "fmt" type Dog struct { Name string Age int } func (dog *Dog) changeAge(age int) { dog.Age = age fmt.Println("方法中改了年龄,", dog) //方法中改了年龄, &{二哈 99} } func main() { var dog = Dog{"二哈", 2} dog.changeAge(99) fmt.Println(dog) //{二哈 99} }
无论是值类型接收器还是指针类型接收器,都可以值来调用或者指针来调
值来调用
package main import "fmt" type Dog struct { Name string Age int } func (dog Dog) changeName(name string) { dog.Name = name fmt.Println("方法中改了名字,", dog) //方法中改了名字, {牧羊犬 2} } func (dog *Dog) changeAge(age int) { dog.Age = age fmt.Println("方法中改了年龄,", dog) //方法中改了年龄, &{二哈 99} } func main() { var dog = Dog{"二哈", 2} dog.changeName("牧羊犬") dog.changeAge(99) fmt.Println(dog) //{二哈 99} }
指针来调用
package main import "fmt" type Dog struct { Name string Age int } func (dog Dog) changeName(name string) { dog.Name = name fmt.Println("方法中改了名字,", dog) //方法中改了名字, {牧羊犬 2} } func (dog *Dog) changeAge(age int) { dog.Age = age fmt.Println("方法中改了年龄,", dog) //方法中改了年龄, &{二哈 99} } func main() { var dog =&Dog{"二哈",2} dog.changeName("牧羊犬") dog.changeAge(99) fmt.Println(dog) //&{二哈 99} }
总结:
1.无论是值还是指针,都可以调用值接收器的方法或者指针接收器的方法
2.无论值还是指针,只有指针接收器的方法,修改才会影响原来的