Go-Interface

  在 Golang 中接口(interface)是一种类型,一种抽象的类型。接口(interface)是一组函数 method (方法)的集合,Golang 中的接口不能包含任何变量。

  在 Golang 中接口中的所有方法都没有方法体,接口定义了一个对象的行为规范,只定
义规范不实现。接口体现了程序设计的多态和高内聚低耦合的思想

  Golang 中的接口也是一种数据类型,不需要显示实现。只需要一个变量含有接口类型
中的所有方法,那么这个变量就实现了这个接口。

定义接口

Golang 中每个接口由数个方法组成,接口的定义格式如下:

其中:
接口名:使用 type 将接口定义为自定义的类型名。Go 语言的接口在命名时,一般会在
单词后面添加 er,如有写操作的接口叫 Writer,有字符串功能的接口叫 Stringer 等。接
口名最好要能突出该接口的类型含义。

方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被
接口所在的包(package)之外的代码访问。

参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。

结构体实现接口

复制代码
package main

import "fmt"

type Person interface {
    eat()
    play()
    //ku(name string, age int) int //定义参数 返回值
}

type xm struct {
}

func (m xm) eat() {
    fmt.Println("Xiao Ming is eating an apple")
}
func (m xm) play() {
    fmt.Println("Xiao Ming is playing ping-pong")
}

// 结构体方法
func (m xm) run() {
    fmt.Println("Xiao Ming is running")
}

func main() {
    xm := xm{} // 实例化结构体

    //xm结构体实现Person接口
    var p Person = xm
    p.eat()
    p.play()

    //p.run() // 没有run接口方法 就会报错
    xm.run() // 使用结构体对象调用自己的方法

    /*
       结果:
           Xiao Ming is eating an apple
           Xiao Ming is playing ping-pong
           Xiao Ming is running

    */
}
复制代码

空接口

Golang 中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。空接口表示
没有任何约束,因此任何类型变量都可以实现空接口。

因为空接口可以存储任意类型值的特点,所以空接口在 Go 语言中的使用十分广泛。

复制代码
package main

import "fmt"

func main() {
    // 定义空接口 a  a可以接收任何的数据类型
    var a interface{}
    fmt.Printf("%T\n", a) //<nil>
    a = 1
    fmt.Printf("type:%T == value:%v\n", a, a) //type:int == value:1

    a = "Hello go"
    fmt.Printf("type:%T == value:%v\n", a, a) //type:string == value:Hello go
    a = true
    fmt.Printf("type:%T == value:%v\n", a, a) //type:bool == value:true

}
复制代码

空接口作为函数的参数

使用空接口实现可以接收任意类型的函数参数。

// 空接口作为函数参数
func show(a interface{}) {
fmt.Printf("type:%T value:%v\n", a, a)
}

map 的值实现空接口

使用空接口实现可以保存任意值的字典。

// 空接口作为 map 值
var studentInfo = make(map[string]interface{})
studentInfo["name"] = "张三"
studentInfo["age"] = 18
studentInfo["married"] = false
fmt.Println(studentInfo)

切片实现空接口

var slice = []interface{}{"张三", 20, true, 32.2}
fmt.Println(slice)

断言

断言就是对接口类型进行判断

语法格式:

x.(T)

x : 表示类型为 interface{}的变量
T : 表示断言 x 可能是的类型。

    _, ok := a.(bool)
    if ok {
        fmt.Println("断言成功,value==", a) //断言成功,value== true

    } else {
        fmt.Println("断言失败")
    }

结合Switch做出断言

复制代码
package main

import "fmt"

func name(x interface{}) {
    switch v := x.(type) {
    case string:
        fmt.Println("string", v)
    case int:
        fmt.Println("int", v)
    case bool:
        fmt.Println("bool", v)
    default:
        fmt.Println("default", v)
    }
}

func main() {
    name(100)            //int 100
    name("Java Rust Go") //string Java Rust Go
}
复制代码

 

 
posted @   GJH-  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示