Go语言接口规则

幸运草 2020年4月25日18:16:28前端框架评论阅读模式

Go语言接口规则

接口是一个或多个方法签名的集合。任何类型的方法集中只要拥有该接口对应的全部方法签名。就表示它 "实现" 了该接口,无须在该类型上显式声明实现了哪个接口。对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返回值,该类型也可以有其他方法。

接口赋值

对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针。

package main

import "fmt"

type User struct {
    id   int
    name string
}

func main() {
    u := User{18, "oldboy"}
    var i interface{} = u

    u.id = 20
    u.name = "Golang"

    fmt.Printf("u : %vn", u)
    fmt.Printf("i.(User) : %vn", i.(User))
}

运行结果:

u : {20 Golang}
i.(User) : {18 oldboy}

接口转型返回临时对象,只有使用指针才能修改其状态。

package main

import "fmt"

type User struct {
    id   int
    name string
}

func main() {
    u := User{18, "oldboy"}
    var vi, pi interface{} = u, &u

    // vi.(User).name = "Golang"
    pi.(*User).name = "Golang"

    fmt.Printf("vi.(User) : %vn", vi.(User))
    fmt.Printf("pi.(*User) : %vn", pi.(*User))
}

空接口

只有当接口存储的类型和对象都为nil时,接口才等于nil。

package main

import (
    "fmt"
)

func main() {
    var i interface{}
    fmt.Printf("i => %vn", i)
    fmt.Printf("(i == nil) => %vn", i == nil)

    var p *int = nil
    // i 指向 p,指向的对象是个nil,但是存在类型不是nil,是个指针
    i = p
    fmt.Printf("i => %vn", i)
    fmt.Printf("(i == nil) => %vn", i == nil)
}

运行结果:

i => <nil>
(i == nil) => true
i => <nil>
(i == nil) => false

接口实现

接口只有方法声明,没有数据字段,没有实现,也不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。

package main

import (
    "fmt"
)

type Info interface {
    GetAge() int
    GetName() string
}

type User struct {
    name string
    age  int
}

func (u User) GetAge() int {
    return u.age
}
func (u User) GetName() string {
    return u.name
}

func main() {
    var user Info = User{"oldboy", 18}
    age := user.GetAge()
    name := user.GetName()
    fmt.Println(age, name)
}

如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个接口。

package main

import (
    "fmt"
)

type Age interface {
    GetAge() int
}

type Name interface {
    GetName() int
}
type User struct {
    name string
    age  int
}

func (u User) GetAge() int {
    return u.age
}

func (u User) GetName() string {
    return u.name
}

func main() {
    user := User{"oldboy", 18}
    age := user.GetAge()
    name := user.GetName()
    fmt.Println(age, name)
}

如果一个变量只含有了一个interface的部分方法,那么这个变量没有实现这个接口。

package main

import (
    "fmt"
)

type Info interface {
    GetAge() int
    GetName() string
}

type User struct {
    name string
    age  int
}

func (u User) GetAge() int {
    return u.age
}

func main() {
    var user Info = User{"oldboy", 18}
    age := user.GetAge()
    fmt.Println(age)
}

编译错误:

./main.go:22:6: cannot use User literal (type User) as type Info in assignment:
    User does not implement Info (missing GetName method)

特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 加入Q群
  • QQ扫一扫
  • weinxin
幸运草
Go语言中处理 HTTP 服务器 前端框架

Go语言中处理 HTTP 服务器

1 概述 包 net/http 提供了HTTP服务器端和客户端的实现。本文说明关于服务器端的部分。 快速开始: package main import (   "log"   "net/http" )...
Go语言常见排序算法 前端框架

Go语言常见排序算法

Go语言常见排序算法 冒泡排序 思路分析:在要排序的切片中,对当前还未排好的序列,从前往后对相邻的两个元素依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的元素比较后发现它们的排序与...

发表评论