对Golang interface的理解

栏目: Go · 发布时间: 6年前

内容简介:原文:理解golang的interface主要在于以下两点:以上代码中,定义了Animal为接口,而Cat和Dog两个结构体分别实现了接口中定义的方法。当interface{}作为函数形参时,可以接受不同类型的参数。

原文: https://www.jianshu.com/p/291d2c1da548?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com

理解golang的interface主要在于以下两点:

  • interface是方法的集合
  • interface是一种类型

简单示例

package main

import "fmt"

type Animal interface {
    Speak() string
}

type Cat struct{}
func (c Cat) Speak() string {
    return "cat"
}

type Dog struct{}
func (d Dog) Speak() string {
    return "dog"
}

func Test(params interface{}) {
    fmt.Println(params)
}

func main() {
    animals := []Animal{Cat{}, Dog{}}
    for _, animal := range animals {
        fmt.Println(animal.Speak())
    }

        Test("string")
    Test(123)
    Test(true)
}

以上代码中,定义了Animal为接口,而Cat和Dog两个结构体分别实现了接口中定义的方法。当interface{}作为函数形参时,可以接受不同类型的参数。

指针与interface

如果将上述代码的:

func (c Cat) Speak() string {
    return "cat"
}

修改为:

func (c *Cat) Speak() string {
    return "cat"
}

再次运行源代码,就会出现以下错误:

cannot use Cat literal (type Cat) as type Animal in array or slice literal:
Cat does not implement Animal (Speak method has pointer receiver)

这是因为程序认为Cat并未实现Speak()方法, 而是由 *Cat 实现的。这说明结构体在实现接口方法时并不会隐式转换类型。

interface 数组

interface{} 作为函数形参和 []interface{} 作为形参有很大区别,示例如下:

package main

import (
    "fmt"
)

func PrintAll(vals []interface{}) {
    for _, val := range vals {
        fmt.Println(val)
    }
}

func main() {
    names := []string{"stanley", "david", "oscar"}
    PrintAll(names)
}

以上代码是无法正常运行的,错误提示为:

cannot use names (type []string) as type []interface {} in argument to PrintAll

这说明对接口数组赋值前,必须多一个类型转换操作,正确代码如下:

package main

import (
    "fmt"
)

func PrintAll(vals []interface{}) {
    for _, val := range vals {
        fmt.Println(val)
    }
}

func main() {
    names := []string{"stanley", "david", "oscar"}
    vals := make([]interface{}, len(names))
    for i, v := range names {
        vals[i] = v
    }
    PrintAll(vals)
}

以上是关于interface使用的基础内容。


以上所述就是小编给大家介绍的《对Golang interface的理解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员的思维修炼

程序员的思维修炼

Andy Hunt / 崔康 / 人民邮电出版社 / 2010-12-10 / 39.00元

本书解释了为什么软件开发是一种精神活动,思考如何解决问题,并就开发人员如何能更好地开发软件进行了评论。书中不仅给出了一些理论上的答案,同时提供了大量实践技术和窍门。 本书供各层次软件开发人员阅读。一起来看看 《程序员的思维修炼》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具