Go语言接口规则

Posted Go程序员开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言接口规则相关的知识,希望对你有一定的参考价值。

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 : %v\n", u)
    fmt.Printf("i.(User) : %v\n", 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) : %v\n", vi.(User))
    fmt.Printf("pi.(*User) : %v\n", pi.(*User))
}

空接口

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

package main

import (
    "fmt"
)

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

    var p *int = nil
    // i 指向 p,指向的对象是个nil,但是存在类型不是nil,是个指针
    i = p
    fmt.Printf("i => %v\n", i)
    fmt.Printf("(i == nil) => %v\n", 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 Useras type Info in assignment:
    User does not implement Info (missing GetName method)

下一篇:

Go语言接口应用------敬请期待!

0基学习Go语言系列:

第一章 环境搭建

   1.1    

   1.2   

   1.3   

第二章 Go语言基础

   2.1   

   2.2   

   2.3   

   2.4   

   2.5   

第三章 Go语言程序结构

   3.1    

   3.2    

   3.3    

   3.4    

第四章 Go语言基本类型

   4.1    

   4.2    

   4.3    

   4.4    

   4.5    

第五章 Go语言引用类型

   5.1    

   5.2    

   5.3    

第六章 自定义类型与指针

   6.1    

   6.2    

   6.3    

第七章 流程控制

   7.1    

   7.2    

   7.3    

   7.4    

   7.5    

   7.6    

第八章 函数

   8.1    

   8.2    

   8.3    

   8.4    

   8.5    

   8.6    

   8.7    

第九章 方法

   9.1    

   9.2    

   9.3    

第十章 接口

   10.1    

   

看完本文有收获?那就分享给更多人吧~

以上是关于Go语言接口规则的主要内容,如果未能解决你的问题,请参考以下文章

go语言基础之接口

go语言碎片整理之接口

Go语言基础之接口

11.Go语言基础之接口

[Go语言]为什么我喜欢Go的interface

go——接口