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

                                

posted @ 2022-09-19 13:49  那就凑个整吧  阅读(18)  评论(0编辑  收藏  举报