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.无论值还是指针,只有指针接收器的方法,修改才会影响原来的
                    
                
                
            
        
浙公网安备 33010602011771号