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.无论值还是指针,只有指针接收器的方法,修改才会影响原来的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构