golang基础--method方法

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

  • Go没有类似python语言中类class的概念,但依旧有method

    • 类型方法定义格式如下
      func (a mytype) method_name(x type)(y type){ return y }
    • 调用方式:
      instance.method(args) -> (type).func(instance, args)
  • 通过显示的说明Receiver(强制函数传递的第一个参数)来实现与某个类型(struct,int...)的组合

    package main
    import "fmt"
    
    type A struct{
        Name Sting
    }
    
    func main() {
        a := A{}                                        //实例化结构体
        a.Method_Print()                                //结构体调用方法
    }
    
    func (a A) Method_Print() {                         //强制将A(struct类型)作为第一个参数传递给Method_Print,从而说明此函数属于结构A的一个方法
        fmt.Println("This is a method for struct A")
    }
    
    /*输出
    This is a method for struct A
    */
  • 只能为同一个包package中的类型定义方法(method),不能为非本package中的类型定义方法,但是方法(这里指公有方法)是可以在其它包中调用。

  • 可以只用值或指针来调用方法,编译器会自动完成转换

    package main
    import "fmt"
    
    type A struct {
        Name string
    }
    
    type B struct {
        Name string
    }
    
    func main() {
        a := A{}                //实例化结构体
        a.Method_Print()        //结构体调用方法
        fmt.Println(a.Name)     //指针传递时,不用使用`*a.Name`,解释器自动识别
    
        b := B{}
        fmt.Println(b.Name)
        b.Method_Print()
    }
    
    func (a *A) Method_Print() {                        //方法传递结构体指针
        a.Name = "maozi"
        fmt.Println("This is a method for struct A")
    }
    
    func (b B) Method_Print() {                         //方法:传递结构
        b.Name = "Sazi"                                 //这种方式只能进行值的拷贝,无法进行更改结构体属性(字段)
        fmt.Println("This is a method for struct B")
    }
    
    /*输出
    a.Method_Print---   This is a method for struct A
    a.Name---           maozi
    b.Name--            //空值,修改失败
    b.Method_Print      This is a method for struct B
    */
  • 类型别名(如下代码INT为int类型的别名)不会拥有底层类型所附带的方法;可以为任一底层类型(int...)绑定一个方法,如下Method_Print

    package main
    import "fmt"
    
    type INT int                                        //自定义一个类型INT,底层为int类型,INT就是底层类型int的一个别名
    
    func main() {
        var a INT
        a.Method_Print()
    
    }
    
    func (a *INT) Method_Print() {                      //为int类型绑定一个方法
        fmt.Println("This is a method for int type ")
    }
    
    /*输出
    a.Method_Print---This is a method for int type
    */
  • Method Values 和 Method Expressions
    • Method Value 是包装后的状态对象,总是与特定的对象实例关联在一起
    • 调用方式类似python类的调用方式,先实例化一个类,在通过.属性调用

    • Method Expression是直接类型.method(var) 的方式

    package main
    import "fmt"
    
    type INT int //定义一个INT
    
    func main() {
        var a INT
        a.Method_Print()                            //method value调用方式
        (*INT).Method_Print(a)                      //method expression调用方式
    }
    
    func (a *INT) Method_Print() {                  //为int类型绑定一个方法
        fmt.Println("This is a method for int type ")
    }
    /*输出
    a.Method_Print---This is a method for int type
    */
  • 类方法名称冲突类似与字段的名称冲突,按继承顺序;如果外部结构和嵌入的结构体存在同名方法,则优先调用外部结构体的方法

  • 类方法访问权限:大写首字母表示外部可以访问,小写表示结构体类型的私有字段,私有字段和方法只能在同一个包中调用,只有公有方法(首字母大写)可以在包外调用

    package main
    import "fmt"
    
    type A struct {
        name string //小写首字母,私有字段
    } 
    
    func main() {
        a := A{}
        a.Method_Print() //method value调用方式
    }
    
    func (a *A) Method_Print() {                                    
        a.name = "123"                                              //方法可以访问私有字段
        fmt.Println("This is a method for struct type ")
    }
    
    /*输出
    a.Method_Print---This is a method for int type
    */
  • 声明一个底层为int的类型,实现调用一个方法就递增250, 如x:=0,调用a.Increase(num)后,a从0变为250

        package main
    import "fmt"
    
    type Ad int                       //声明底层类型为int类型
        func main() {
        var x Ad
        x.Add(250)                   //method value调用方式,方法传递参数num=100
        fmt.Println(a)
    }
    func (ad *Ad) Add(num int) {    //为int类型绑定一个方法
        *ad += Ad(num)              //强制类型转换为底层Ad---int型
    }
    /*输出
    a--->250
    */

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

本文来自:博客园

感谢作者:failymao

查看原文:golang基础--method方法

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

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