189 8069 5689

go语言中的接口是什么-创新互联

golang 什么是接口?

创新互联建站是一家专业提供马尾企业网站建设,专注与成都网站建设、网站制作、H5网站设计、小程序制作等业务。10年已为马尾众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。

如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键。在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构的核心。

相关推荐:golang教程

golang中的接口

1. 接口

概念:接口定义了一组方法,但是不包含这些方法的具体实现;它们是抽象的,接口不能包含变量。

接口的定义格式

type Namer interface {
method1() return_type
method2() return_type
}

2. 一个接口的栗子

    package main
    import "fmt"
    
    type Message interface {
        Send()
    }
    type user struct {
        name string
        score int
    }
    func (u *user) Send() {
        fmt.Println("hi", u.name, "this is your ", u.score)
    }
    func sendMessage(msg Message) {
        msg.Send()
    }
    func main() {
        u := &user{name: "roty", score: 44}
        sendMessage(&u)
    }

Golang 中的 interface 让编码更灵活、易扩展,使得 Go 拥有了面向对象多态的特性。

在此我们记住三点就够了:

● 方法声明的集合

● 任何类型的对象实现了在接口中声明的全部方法,则表明该类型实现了对应接口。

● 可以作为一种数据类型,实现了该接口的任何对象都可以给对应的接口类型变量赋值。

结合例子去理解上述三点:

package main
import "fmt"
import "math"
// 几何图形的接口(interface)
type geometry interface {
    area() float64
    perim() float64
}
// rect 和 circle 实现 geometry 接口
type rect struct {
    width, height float64
}
type circle struct {
    radius float64
}
// 实现了接口中声明的所有方法即实现了该接口,这里 rects 实现了 geometry 接口
func (r rect) area() float64 {
    return r.width * r.height
}
func (r rect) perim() float64 {
    return 2*r.width + 2*r.height
}
// circles 实现 geometry 接口
func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
    return 2 * math.Pi * c.radius
}
// 定义的接口可以作为一种数据类型,当一个变量的类型为一个接口类型时,这个变量可以调用接口中定义的方法。
// 这里定义一个函数,接收一个类型为 geometry 的参数变量
func measure(g geometry) {
    fmt.Println(g)
    fmt.Println(g.area())
    fmt.Println(g.perim())
}
func main() {
    r := rect{width: 3, height: 4}
    c := circle{radius: 5}
    // The circle and rect struct types both implement the geometry interface so we can use instances of these structs as arguments to measure.
    // rect 和 circle 结构类型都实现了 geometry 接口,所以我们能够把它们的对象作为参数传给 measure 函数
    // 在 measure 函数内部,参数对象调用了所属类型实现的接口方法。
    measure(r)
    measure(c)
}

一种类型只要实现接口声明的方法就算实现了接口,同样一种类型能同时支持实现多个接口了,一个接口也能被多种类型实现。如果一种类型实现了某个接口,那么这种类型的对象能够赋值给这个接口类型的变量。

package main
import "fmt"
type I interface {
  method1()
}
type T struct{}
func (T) method1()  {}
func main()  {
  var i I = T{}
  fmt.Println(i)
}

最后的一部分解释一下 interface{} 类型,这种类型的接口没有声明任何一个方法,俗称空接口。因为任何类型的对象都默认实现了空接口(上文提到任意类型只要实现了接口的方法就算实现了对应的接口,由于空接口没有方法,故所有类型默认都实现了空接口)在需要任意类型变量的场景下非常有用。

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)
}
// stanley
// david
// oscar

以上就是golang中什么是接口的详细内容,更多请关注创新互联成都网站设计公司其它相关文章!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前名称:go语言中的接口是什么-创新互联
文章转载:http://jkwzsj.com/article/doijoe.html

其他资讯