go之方法

什么是方法

  方法其实就是一个函数,在func这个关键字和方法名中间加入一个特殊的接收器类型,接收器可以是结构体类型或者是非结构体类型,接收器是可以在方法的内部访问的 

方法的结构

1
2
3
func (接收器)   方法名(参数1 参数类型,参数2 参数类型)(返回值){
   内容
}

定义方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()
}

有了函数,为什么还要方法

  函数有几个值就要传几个,不能自动传值

  方法绑定给结构体,拿到结构体对象直接调用即可,不需要再传参数

值接收器

  修改不会影响原来的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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}
}

指针类型接收器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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}
}

无论是值类型接收器还是指针类型接收器,都可以值来调用或者指针来调

  值来调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 @   那就凑个整吧  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示