zoukankan      html  css  js  c++  java
  • Go

    hello, 大家好,由于之前工作上面的事情较多,所以关于go语言的学习就暂时“搁浅了”。。。不过从今天开始,我们又将回到了go语言的学习过程之中。

    当然,我们学习go的"初心"是为了看懂docker的source code。这个系列也就是先针对go的基本语法进行学习,实战是在 go的source code 的时候进行。

    最近也找了一本国内比较好的docker 源码的书籍《Docker 源码分析》开始看看。如果有兴趣的童鞋,欢迎交流!!一起进步!!

    Method的使用

    - go 语言中虽然没有class,但是可以有struct,以及我们可以为指定的struct定义method

    下面的例子中,分别为type A和B定义了一个 Print 方法(通过method的receiver)来显示指定type

    // method demo
    package main
    
    import (
        "fmt"
    )
    
    type A struct {
        name string
    }
    
    type B struct {
        name string
    }
    
    func (a A) Print() {  // receiver is a, its type is A
        fmt.Println(a.name)
    }
    
    func (b B) Print() { // receiver is a, its type is A
    fmt.Println(b.name) 
    }

    func main() {
    a :
    = A{name: "A"}
    b :
    = B{name: "B"}

    a.Print()
    b.Print()
    }

    注:

    1. 只能为同一个包中的类型定义方法。

    2. 方法可以调用类型中的非公开字段。(这里的 name )

    - method 其实可以理解为 方法 (function)的语法糖

    由于method 的receiver 本质上就是 method 的 第一个参数

    func (a A) Print() {  // receiver is the first parameter of method
        fmt.Println(a.name)
    }

    使用method value 和 method expression 调用方法:

    func (a A) Print() {  // receiver is the first parameter of method
        fmt.Println(a.name)
    }
    
    func main(){
        a:=A{}
        a.Print() // method value 
        (*A).Print(&a) // method expression         
    }

    - receiver 可以使类型,也可以是类型的指针,但是调用时,可以都写成类型调用(由于编译器的自动转换)

    // method demo
    package main
    
    
    import (
        "fmt"
    )
    
    
    type A struct {
        Name string
    }
    
    
    type B struct {
        Name string
    }
    
    
    func (a A) Print() {
        a.Name = "a"
        fmt.Println(a.Name)
    }
    
    
    func (b *B) Print() {
        b.Name = "b"
        fmt.Println(b.Name)
    }
    
    
    func main() {
        a := A{Name: "A"}
        b := B{Name: "B"}
    
    
        a.Print()
        fmt.Println(a.Name)
        b.Print()
        fmt.Println(b.Name)
    }
    
    

    output 如下:

    我们在2个Print方法里面分别设置receiver为类型和指针,调用的时候均采用类型的方式来调用,但是得到不同的输出结果。。

    - 使用 method 为内置类型添加方法

    我们可以通过定义别名的方式来扩展内置类型,从而实现扩展。例如:

    // method demo
    package main
    
    import (
        "fmt"
    )
    
    type myInt int
    
    func (myint myInt) Print() {
        fmt.Println("this is my integer !!")
    }
    
    func main() {
        var myint myInt
        myint.Print()
    }

    输出为:

  • 相关阅读:
    域环境的搭建 (超级详细)
    sqli-labs(10)
    sqli-labs(9)
    mysql源码安装(5.1)
    查看mysql apache php nginx的编译参数
    LAMP的安装
    Mysql的安装(二进制免编译包) 5.1版本
    更改yum网易 阿里云的yum源。
    yum安裝的包如何保留到本地
    磁盘分区
  • 原文地址:https://www.cnblogs.com/atuotuo/p/7047829.html
Copyright © 2011-2022 走看看