go中的方法学习

Mr_Pon · · 546 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go 小白一枚,建了一个关于go的微信交流群 欢迎大家加入,加我微信拉群 微信号:XU1014129578 暗号 :gogogo ### 方法的定义 ``` func (recevier type) methodName(参数列表) (返回值列表){ 方法体 return 返回值 } ``` ### 方法的使用 1. 方法需要个定义的类型进行绑定 ``` type Person struct { Name string } func (p Person)testMothod(){ //绑定P类型 fmt.Println("Name =",p.Name) } func main() { person := Person{Name:"jack"} person.testMothod() } ``` 1. golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct 例如:`type number int` number 也是可以绑定方法的 1. 方法只能通过定义的类型的变量来调用,而不能直接调用,也不能使用其他类型变量来调用 ``` type Person struct { Name string } type Car struct { Price int } func (p Person)testMothod(){ fmt.Println("Name =",p.Name) } func main() { //正确调用 person := Person{Name:"jack"} person.testMothod() //错误调用 car := Car{Price:5000000} car.testMothod() //只能使用Person类型调用,使用Car调用就会报错 } ``` ### 方法和函数的区别 1. 调用方式不一样 函数调用方式:函数名(实参列表) 方法调用方式: 变量.方法名(实参列表) 代码: ``` package main import ( "fmt" ) type Person struct { Name string } //函数 func testFunc(p Person){ fmt.Println("函数中的Name = ",p.Name) } //方法 func (p Person) testMethod(){ fmt.Println("方法中的Name = ",p.Name) } func main(){ //函数调用方式 person := Person{Name:"Jack"} testFunc(person) //方法调用方式 person.Name = "Pon" person.testMethod() } ``` 运行结果: ![GO 方法详解](https://cdn.learnku.com/uploads/images/202004/13/39012/8xtUfJ1wB4.png!large) 2.对于普通函数,接收则为值类型时,不能将指针类型的数据直接传递,反之亦然 ``` type Person struct { Name string } func testFunc01(p Person){ fmt.Println("函数中的Name = ",p.Name) } func testFunc02(p *Person){ fmt.Println("函数中的Name = ",p.Name) } func main(){ //函数调用 person := Person{Name:"Jack"} testFunc01(person) testFunc02(&person) //这里如果testFunc02(person) 这样调用就会报错 } ``` 3.对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以 ``` type Person struct { Name string } func (p Person) testMethod01(){ fmt.Println("方法中的Name = ",p.Name) } func (p *Person) testMethod02(){ fmt.Println("方法中的Name = ",p.Name) } func main(){ //方法调用 person := Person{Name:"Jack"} person.testMethod01() //这里 person.testMethod01() 和 (&person).testMethod01() 调用都是一样的,都是值拷贝 (&person).testMethod02() //这里 person.testMethod02() 和 (&person).testMethod02() 调用都是一样的,都是地址拷贝 } ``` 总结: 不管调用形式如何,真正决定是值拷贝还是地址拷贝,看这个方法和那个类型绑定。 如果是和值类型,比如(p Person),则是值拷贝,如果和指针类型,比如(p *Person)则是地址拷贝

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

546 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传