go中的方法学习

Mr_Pon · 2020-04-13 16:17:03 · 756 次点击 · 预计阅读时间 3 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2020-04-13 16:17:03 的文章,其中的信息可能已经有所发展或是发生改变。

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()
    }
    
  2. golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct 例如:type number int number 也是可以绑定方法的
  3. 方法只能通过定义的类型的变量来调用,而不能直接调用,也不能使用其他类型变量来调用
    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调用就会报错
    }
    

    方法和函数的区别

  4. 调用方式不一样 函数调用方式:函数名(实参列表) 方法调用方式: 变量.方法名(实参列表)

代码:

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 方法详解

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

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