0

0

关于 golang 的接口介绍

藏色散人

藏色散人

发布时间:2020-09-15 10:21:35

|

3030人浏览过

|

来源于cnblogs

转载

下面由golang教程栏目给大家介绍关于 golang 的接口,希望对需要的朋友有所帮助!

关于 golang 的接口介绍

在Go语言中接口(interface)是一种类型,一种抽象的类型。

接口的定义

定义格式:

type 接口类型名 interface{
    方法名1( 参数列表1 ) 返回值列表1
    方法名2( 参数列表2 ) 返回值列表2
    …
}

Go语言的接口在命名时,一般会在单词后面添加er,接口名最好要能突出该接口的类型含义。

接口实现

一个对象只要全部实现了接口中的方法,那么就实现了这个接口。
Go语言中不同的类型可以实现同一个接口。(示例中dog和cat都实现了Animal接口)

立即学习go语言免费学习笔记(深入)”;

//定义一个Animal接口// Animal 是一个动物接口,实现move()和say()方法type Animal interface {
    move()
    say()
}//定义dog结构体type dog struct {
    name string
}//定义cat结构体type cat struct {
    name string
}//dog实现move方法func (d dog) move() {
    fmt.Printf("%s会跑\n",d.name)
}//dog实现say方法func (d dog) say() {
    fmt.Printf("%s会叫汪汪汪\n",d.name)
}//cat实现move方法func (c *cat) move() {
    fmt.Printf("%s会跑\n",c.name)
}//cat实现say方法func (c cat) say() {
    fmt.Printf("%s会叫喵喵喵\n",c.name)
}func main()  {    var a Animal    //声明一个Animal类型的a    //实例化一个dog结构体
    d := dog{name:"旺财"}
    fmt.Printf("%T\n", d)       //main.dog
    d.move()    //旺财会跑
    d.say()     //旺财会叫汪汪汪
    a = d // 接口是一种类型,一种抽象的类型。
    fmt.Println(a)  //{旺财}    //实例化一个cat结构体
    c := cat{name:"蓝猫"}
    c.move()    //蓝猫会跑
    c.say()     //蓝猫会叫喵喵喵
}

多态

GO语言通过接口模拟多态。

类型与接口关系

一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现。
Go语言中不同的类型可以实现同一个接口。

接口嵌套

接口与接口间可以通过嵌套创造出新的接口。

思高网络商城CycooShop
思高网络商城CycooShop

主要模块:首页商品推荐 /顾客留言发布 /商品分类浏览 /按商品分类、关键字搜索商品 /商品购物车 人信息中心 /显示商品详细介绍以及多图片显示功能 /商品类别管理有分大类中类的类别设定商品搜索类别设定 /商品管理有临时关闭不在线功能 /订单管理 /支付类型管理模块 留言管理 /后台权限分级管理 /密码修改 /新闻管理 /网站配置管理 /滚动广告管理v1.58更新:1、增强支付接口设置。2、内置支

下载
//定义speaker接口type speaker interface {
    speak()
}//定义mover接口type mover interface {
    move()
}// 接口嵌套type animal interface {
    speaker
    mover
}//定义cat结构体type cat struct {
    name string
}//cat是值类型接收者func (c cat) speak() {
    fmt.Println("喵喵喵")
}func (c cat) move() {
    fmt.Println("猫会动")
}func main()  {    var x animal
    x = cat{name: "花花"}
    x.move()    //猫会动
    x.speak()   //喵喵喵
}

空接口

空接口定义

空接口是指没有定义任何方法的接口。空接口类型的变量可以存储任意类型的变量。

//空接口func main()  {    var x interface{}
    x = 100     //int类型
    fmt.Println(x)  //100
    x = "ares"  //string类型
    fmt.Println(x)  //ares
    x = struct {    //结构体类型
        name string
    }{name:"ares"}  //结构体赋值
    fmt.Println(x)  //ares
}

空接口应用

空接口可以作为函数的参数或map的值。

//空接口func showType(a interface{}) {
    fmt.Printf("type:%T\n", a)
}func main()  {    //空接口作为函数的参数
    showType(100)       //type:int
    showType("ares")    //type:string    //定义一个值为空接口的map    var stu = make(map[string]interface{},100)
    stu["ares"] = 100
    stu["ares1"] = "男"
    fmt.Println(stu)    //map[ares:100 ares1:男]    //map,key是字符串,value是任意类型
    map1 := make(map[string]interface{})
    map1["name"] = "ares"
    map1["age"] = 18
    map1["id"] = 1
    map1["friend"] = struct {
        name string
        age  int
    }{"jay", 33}
    fmt.Println(map1) //map[age:18 friend:{jay 33} id:1 name:ares]
    }

接口嵌套

类似于继承。

type A interface {
    test1()
}type B interface {
    test2()
}type C interface {
    A
    B
    test3()
}type Cat struct { //如果要实现接口c,需要将接口a和接口b中的方法一起实现
}func (c Cat) test1() {
    fmt.Println("test1...")
}func (c Cat) test2() {
    fmt.Println("test2...")
}func (c Cat) test3() {
    fmt.Println("test3...")
}func main() {    var cat = Cat{}
    cat.test1() //test1...
    cat.test2() //test2...
    cat.test3() //test3...    //将cat赋值接口A类型,则只能使用test1方法    var cat1 A = Cat{}
    cat1.test1() //test1...    //将cat赋值接口B类型,则只能使用test2方法    var cat2 B = Cat{}
    cat2.test2() //test2...
}

类型断言

语法:

x.(T)

x:表示类型为interface{}的变量
T:表示断言x可能是的类型
若为true则表示断言成功,为false则表示断言失败。

//类型断言func justifyType(x interface{}) {    switch v := x.(type) {    case string:
        fmt.Printf("x is a string,value is %v\n", v)    case int:
        fmt.Printf("x is a int is %v\n", v)    case bool:
        fmt.Printf("x is a bool is %v\n", v)    case *string:
        fmt.Printf("x is a point指针 is %v\n", v)    case struct{}:
        fmt.Printf("x is a struct is %v\n", v)    default:
        fmt.Println("unsupport type!")
    }}func main()  {
    justifyType(100)        //x is a int is 100
    justifyType("ares") //x is a string,value is ares
    justifyType(false)  //x is a bool is false
    x := "ares"
    justifyType(&x) //x is a point指针 is 0xc000094010
    justifyType(struct {}{})    //x is a struct is {}
    justifyType([]int{123}) //unsupport type!
}

值接收者指针接收者实现接口的区别

如果接收者为指针类型的话,不能把值传进去。

//定义animal接口type animal interface {
    speak()
    move()
}//定义cat结构体type cat struct{
    name string
}//定义dog结构体type dog struct{
    name string
}//值接收者
 func (c cat) speak() {
    fmt.Printf("%s会叫喵喵喵\n",c.name)
 } func (c cat) move() {
    fmt.Printf("%s会动\n",c.name)
 } //指针接收者func (d *dog) speak() {
    fmt.Printf("%s会叫汪汪汪\n",d.name)
}func (d *dog) move() {
    fmt.Printf("%s会动\n",d.name)
}func main()  {    var c1 animal
    lm := cat{name:"蓝猫"}
    c1 = lm     //因为实现animal接口的是cat值类型,所以可以直接赋值
    c1.move()   //蓝猫会动
    c1.speak()  //蓝猫会叫喵喵喵    var c2 animal
    jm := &dog{name:"金毛"}   //现animal接口的是*dog类型,所以必须要通过&来取值
    c2 = jm
    c2.move()   //金毛会动
    c2.speak()  //金毛会叫汪汪汪
}

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

9

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

8

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

3

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

17

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang socket 编程
golang socket 编程

共2课时 | 0.1万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号