zoukankan      html  css  js  c++  java
  • GO 方法

    一 方法声明

    在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法

    func (i ST) add(q int) int {
        return i.x + q
    }
    
    
    func add(i ST, q int) int {
        return i.x + q
    }
    
    
    func main() {
    
    
        st1 := ST{100}
        fmt.Println(st1.add(200))
    这种st1.add的表达式叫做选择器,因为他会选择合适的对应p这个对象的add方法来执行

    二 基于指针对象的方法

    当这个接受者变量本身比较大时,我们就可以用其指针而不是对象来声明方法

    func (i *ST) add2(q int) int {
        return i.x + q
    }
    //这个方法的名字是(*ST).add2。这里的括号是必须的
    
    
    func main() {
    
    
        st1 := ST{100}
        fmt.Println(st1.add2(200)) //编译器会隐式地帮我们用&st去调用add2这个方法

    三 嵌入结构体扩展类型

    
    
    type ST struct {
        x int
    }
    
    
    type ST2 struct {
        ST //在类型中内嵌的匿名字段也可能是一个命名类型的指针,比如*ST,这种情况下字段和方法会被间接地引入到当前的类型中。添加这一层间接关系让我们可以共享通用的结构并动态地改变对象之间的关系
        y int
    }
    
    
    func (i ST) add(q int) int {
        return i.x + q
    }
    
    
    func main() {
    
    
        st0 := ST2{ST{100}, 200}
    
    
        fmt.Println(st0.add(100))

    我们可以把ST2类型当作接收器来调用ST里的方法,即使ST2里没有声明这些方法。一个ST2并不是一个ST,但他"has a"ST,并且它有从ST类里引入的add方法。
    内嵌字段会指导编译器去生成额外的包装方法来委托已经声明好的方法
    再看一个例子
    var cache = struct {
        sync.Mutex
        mapping map[string]string
    }{
        mapping: make(map[string]string),
    }
    
    
    func Lookup(key string) string {
        cache.Lock()
        v := cache.mapping[key]
        cache.Unlock()
        return v
    }



  • 相关阅读:
    C++进阶--析构函数中的异常
    C++进阶--派生类的析构(虚析构函数,shared_ptr)
    linux_shell_拆分文件_多进程脚本
    java_eclipse_设置全局编码_utf-8_编译class指定_运行jar乱码解决_不依赖环境
    linux_环境变量设置 utf-8
    linux_awk_内部正则过滤
    java_Eclipse中SVN的安装步骤(两种)和使用方法
    linux_vim_快捷键
    php_公共方法01_传入数组_打印可见信息
    linux_sed 正则替换
  • 原文地址:https://www.cnblogs.com/sysnap/p/6862399.html
Copyright © 2011-2022 走看看