新手问题 GO 里面的 interface 有点难理解啊,假如用 ruby 来诠释一下,相当于什么概念

ad583255925 · 2017年06月23日 · 最后由 theblock24block 回复于 2017年06月23日 · 2208 次阅读
package main

import (
    "fmt"
    "math"
)

type Abser interface {
    Abs() float64
}

type MyFloat float64

func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}

func main() {
    var a Abser
    f := MyFloat(-math.Sqrt2)
    a = f  // a MyFloat implements Abser
    fmt.Println(a.Abs())
}

比如这段用 ruby 来打比方

项目大了我找不到 interface 实现部分的源码,ide 都不行,必须手动来。各位有招不?

相当于 Ruby 中的 duck type,Java 中的 Interface

你这段代码没有体现出 interface 的意思

nouse 回复

实际应用最多的场景是什么

用于实现“鸭子类型”的,你如果真的懂 Ruby,听到这个就应该知道是啥意思了

func (f MyFloat) Abs() float64 { 这个是什么意思?

接口就是一种合同一样的约束吧。

别用 Ruby 去模拟和理解 Go 的 Interface,概念落差太大了,没有深刻理解静态编译你无法知晓 interface 到底是用来干嘛的。

chenge 回复

func (f MyFloat) Abs() float64 表示给类型 MyFloat 定义一个叫 Abs 的方法,此后就可以在 MyFloat 类型的变量上调用这个方法了,而同时由于 MyFloat 类型满足了 Abser 接口的要求,也就可以在需要 Abser 型参数的地方传递使用了

flowerwrong 回复

Vim 配合 vim-go 插件表示如鱼得水,毫无问题 😏

chenge 回复

你示例代码改成这样更容易理解:

package main

import "fmt"

type Abser interface {
    Abs() float64
}

type MyFloat float64

func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}

func printAbs(a Abser) {
    fmt.Println(a.Abs())
}

func main() {
    num := MyFloat(-123.45)
    printAbs(num)
}
ruchee 回复

大致看懂了,谢谢。有新鲜感。有点绑定方法的意思。

简单的我把它当成了 转接口功能

这个特性比较像 java 那套,编译时检查类型,不能按 ruby 运行时的去理解

需要 登录 后方可回复, 如果你还没有账号请 注册新账号