• go11---方法method


    package main
    
    /*
    方法method
    
    Go 中虽没有class,但依旧有method
    通过显示说明receiver来实现与某个类型的组合
    只能为同一个包中的类型定义方法
    Receiver 可以是类型的值或者指针
    不存在方法重载
    可以使用值或指针来调用方法,编译器会自动完成转换
    从某种意义上来说,方法是函数的语法糖,因为receiver其实就是
    方法所接收的第1个参数(Method Value vs. Method Expression)
    如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
    类型别名不会拥有底层类型所附带的方法
    方法可以调用结构中的非公开字段
    
    */
    
    //go语言没有方法的重载概念,
    import (
        "fmt"
    )
    
    type A struct {
        name string
    }
    
    type B struct {
        name string //小写是私有字段,方法Print1也可以访问,小写对于整个package是公有的,包外面不能访问,
    }
    
    func main() {
        a := A{}
        a.Print(1)          //"A"
        a.Print1()          //"A1"
        fmt.Println(a.name) //a1,也可以访问结构体的私有字段,
    
        b := B{}
        b.Print(1)          //"B"
        b.Print1()          //"B1"
        fmt.Println(b.name) //""
    
        var c TZ
        c.print() //"TZ",这样就可以为基本类型int绑定方法了,这就是为什么type不仅仅是别名,
        //因此TZ类型转换成int类型要强制转换,因为无法为int类型绑定方法(即使在int包中绑定了方法,
        //其余包也是在不到这个方法的),但是通过type定义别名后就可以为基本类型绑定方法了,
        fmt.Println(c)  //10000
        (*TZ).print(&c) //"TZ",也调用了print方法,两者都可以,
    }
    
    func (a A) Print(c int) { //a A就是reciver接收者,Print方法就是结构体A的方法,
        fmt.Println("A")
    }
    func (a *A) Print1() { //把a结构体的指针闯进来,可以修改a里面的值,
        //传递的是地址(结构体传递参数是值传递不是引用传递,但是这里强制传递的是地址)
        a.name = "a1"
        fmt.Println("A1")
    }
    
    func (b B) Print(c int) { //b B就是reciver接收者,Print方法就是结构体B的方法,
        fmt.Println("B")
    }
    
    func (b B) Print1() { //没有传递指针,不能修改b结构体里面的值,
        b.name = "b1"
        fmt.Println("B1")
    }
    
    //可以为内置的基本类型绑定方法
    type TZ int //别名
    
    func (a *TZ) print() {
        *a = 10000
        fmt.Println("TZ")
    }
    package main
    
    /*
     */
    
    import (
        "fmt"
    )
    
    type TZ int
    
    func (tz *TZ) add(num int) {
        *tz += TZ(num) //int类型要强制转换成TZ类型
    }
    
    func main() {
        var a TZ
        a.add(100)
        fmt.Println(a) //100
    }
  • 相关阅读:
    git/gerrit上已经删除了远程分支,本地仍然能看到的解决方法
    bat中查找文件夹下有几个某类型的文件
    ERROR 1045 (28000)问题解决
    Unsupervised Pretraining Transfers well Across Languages
    由声学特征重建语音波形-声码器的最近进展
    神经机器翻译中有用的技巧
    多语种神经机器翻译
    利用Fairseq训练新的机器翻译模型
    转:Linux 系统忘记密码 -> 修改 Ubuntu 虚拟机密码
    Linux安装与配置Tomcat
  • 原文地址:https://www.cnblogs.com/yaowen/p/8076448.html
Copyright © 2020-2023  润新知