• 【GO for java programmers】面向Java开发者的GO编程3_go for java(1)


    m := make([]int, 10, 20)  // Same as new([20]int)[:10]
    
    

    方法和接口

    方法

    方法看起来像一个普通的函数定义,但它有一个receiver(接收者)。receiver是类似Java实例方法中的this引用。

    type MyType struct { i int }
    
    func (p *MyType) Get() int {
        return p.i
    }
    
    var pm = new(MyType)
    var n = pm.Get()
    
    

    这声明了一个方法GetMyType关联的。receiver被命名为p 在函数体内。

    命名的类型来定义方法。如果您转换不同类型的值,新的值将有新的类型,而不是那些旧的类型。

    你可以定义一个内置类型的方法,用新的命名类型声明。新的类型和内置的类型是不同的

    type MyInt int
    
    func (p MyInt) Get() int {
        return int(p)  // The conversion is required.
    }
    
    func f(i int) {}
    var v MyInt
    
    v = v * v          // The operators of the underlying type still apply.
    f(int(v))          // int(v) has no defined methods.
    f(v)               // INVALID
    
    
    接口

    Go接口类似于Java接口,但可被视为一个实现该接口提供任何类型的在Go接口命名的方法。明确的声明是不必要的。

    接口像这样:

    type MyInterface interface {
        Get() int
        Set(i int)
    }
    
    

    自从 MyType 已经有了Get 方法, 我们可以让 MyType满足接口通过添加

    func (p *MyType) Set(i int) {
        p.i = i
    }
    
    

    现在任何只要将MyInterface当做参数就可以接收类型是*MyType的变量

    func GetAndSet(x MyInterface) {}
    
    func f1() {
        var p MyType
        GetAndSet(&p)
    }
    
    

    在Java术语,给*MyType 定义 SetGet 使*MyType自动实现了MyInterface接口。这种类型型可满足多个接口。这是一种形式的鸭子类型。

    “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

    James Whitcomb Riley

    匿名域

    匿名域可以用于实现很像一个Java子类的东西。

    type MySubType struct {
        MyType
        j int
    }
    
    func (p *MySubType) Get() int {
        p.j++
        return p.MyType.Get()
    }
    
    

    MySubType有效实现的像是MyType的子类型.

    func f2() {
        var p MySubType
        GetAndSet(&p)
    }
    
    

    Set方法是继承自MyType的,因为关联了匿名域的方法的变为了封闭类型的方法。在这种情况下,因为 MySubType有一个匿名与域 MyType类型,所以为 MyTypee的方法也成为MySubType的方法。Get方法被重写,Set方法被继承。

    这是与Java中的子类不完全相同。当一个匿名域的方法被调用时,它的 receiver就是这个匿名域,而不是周围的结构体。换句话说,匿名域上的方法的不会动态调度。当你想要实现相当于Java的动态方法查找,请使用接口。

    func f3() {
        var v MyInterface
    
        v = new(MyType)
        v.Get()  // Call the Get method for *MyType.
    
        v = new(MySubType)
        v.Get()  // Call the Get method for *MySubType.
    }
    
    
    类型断言

    使用一个类型断言可以使具有一个接口类型的变量转换成具有不同的接口类型。这是在运行时动态执行。与Java不同,并不需要任何声明两个接口之间的关系。

    type Printer interface {
        Print()
    }
    
    func f4(x MyInterface) {
        x.(Printer).Print()  // type assertion to Printer
    }
    
    

    转换为Printer 完全是动态的。只要x(x中存储的值的实际类型)的 动态类型 定义了一个Print方法。

    =========未完待续…

    =======转载注明出处=

    最后

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    资料过多,篇幅有限

    自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。

    ======转载注明出处=

    最后

    [外链图片转存中…(img-H3ZgQoSQ-1718772344169)]

    [外链图片转存中…(img-8C6Ff439-1718772344170)]

    资料过多,篇幅有限

    自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。

  • 相关阅读:
    在STM32F103C8T6上使用RT_Thread Nano移植控制台和Finsh
    Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)
    不支持TLS的设备如何实现游客登录加密通信方案
    SPDK NVMe-oF TCP transport目前优化的工作和方向
    隐私计算FATE-离线预测
    从零开始学习SLAM
    CentOS7.6安装Rabbitmq
    java毕业设计防疫卫生资讯推荐系统Mybatis+系统+数据库+调试部署
    大数据flink篇之三-flink运行环境安装后续一yarn-session安装
    Java基础练习题(1.以阶乘为例演示方法调用、2.判断一个整数是否为回文数、3.随机生成一个在1-10范围之间的数)
  • 原文地址:https://blog.csdn.net/2401_85124905/article/details/139799686