返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言的接口详解
  • 492
分享到

Go语言的接口详解

2024-04-02 19:04:59 492人浏览 八月长安
摘要

目录1、接口的用途2、类型断言3、类型选择4、空接口5、匿名空接口6、实现多个接口7、接口嵌套8、接口零值9、make和new的区别总结接口就是一系列方法的集合(规范行为) 在面向对

接口就是一系列方法的集合(规范行为)

面向对象的领域里,接口一般这样定义:接口定义一个对象的行为,规范子类对象的行为。

Go 语言中的接口是非侵入式接口(接口没了,不影响代码),侵入式接口(接口没了,子类报错)

Go 也是鸭子类型,比如我现在有个鸭子类,内有 speak 方法和 run 方法,子类只要实现了 speak 和 run,我就认为子类是鸭子,我只要子类中有这两个方法你就是鸭子,有这两个方法你就是鸭子,他是从下往上推导只要有你这里面的东西,那就是算是继承了你这个接口

1、接口的用途

接口是一个类型


// Duck 定义一个鸭子接口
type Duck interface {
   speak()
   run()
}

// WhiteDuck 定义一个白鸭子结构体
type WhiteDuck struct {
   name  string
   age int
   sex string
}

// BlackDuck 定义一个黑鸭子结构体
type BlackDuck struct {
   name  string
   age int
   sex string
}

// 让白鸭子和黑鸭子绑定接口中的所有方法,就叫实现该接口
// 让白鸭子实现 Duck 接口
func (w WhiteDuck) speak() {
   fmt.Println("白鸭子嘎嘎叫,它的名字叫", w.name)
}

func (w WhiteDuck) run() {
   fmt.Println("白鸭子慢悠悠的走,它的名字叫", w.name)
}

// 让黑鸭子实现 Duck 接口
func (b BlackDuck) speak() {
   fmt.Println("黑鸭子呱呱叫,它的名字叫", b.name)
}

func (b BlackDuck) run() {
   fmt.Println("黑鸭子歪歪扭扭的走,它的名字叫", b.name)
}


func main() {
   var duck Duck
   duck = WhiteDuck{"小白", 15, "男"}	// 把我的对象赋值给一个接口类型,就可以实现多态的效果
   fmt.Println(duck)
    
   // duck 现在他是一个接口,它只能取方法,不能取出属性了。
   duck.speak()
   duck.run()
}


// 输出:
{小白 15 男}
白鸭子嘎嘎叫,它的名字叫 小白
白鸭子慢悠悠的走,它的名字叫 小白

2、类型断言

用于提取接口的底层值,就是把接口类型转成 struct ,属性,自有方法也有了。


func main() {
	var duck Duck = WhiteDuck{"小白", 15, "男"}
	// 断言是 WhiteDuck 类型
	value, ok := duck.(WhiteDuck)
	// 断言成功,ok=true,value就是WhiteDuck结构体对象
	fmt.Println(value)		// 输出:{小白 15 男}
	fmt.Println(value.name)	// 输出:小白
	fmt.Println(ok)			// 输出:true

	// 断言失败,ok1=false,value1是BlackDuck类型的空值,因为没有赋值
	value1, ok1 := duck.(BlackDuck)
	fmt.Println(value1)		// 输出:{ 0 }
	fmt.Println(ok1)		// 输出:false
}

3、类型选择

(通过 Type Switch )

用于将接口的具体类型与很多 case 语句所指定的类型进行比较。


func main() {
   var duck Duck = WhiteDuck{"小白", 15, "男"}
   test(duck)
}

func test(duck Duck) {
   switch value := duck.(type) {
   case WhiteDuck:
      fmt.Println(value.name)
      fmt.Println("我是白鸭子")
   case BlackDuck:
      fmt.Println(value.name)
      fmt.Println("我是黑鸭子")
   default:
      fmt.Println(value)
      fmt.Println("我是鸭子这个类")
   }
}

4、空接口

没有任何方法,所有数据类型都实现了空接口


type Empty interface {} // 空接口

func main() {
   var a int = 10
   var b string = "XiaoYang"
   var c [3]int
   var e Empty    // e是空接口类型,可以接受任意的数据类型
   e = a
   e = b
   e = c
    
   // 这样的话需要把它类型选择回来
   // 正常情况下我只能接收 Empty 类型的,但是 a b c 都不是 Empty 类型的
   test(a)	// 输出:我是int 10
   test(b)	// 输出:我是字符串 XiaoYang
   test(c)	// 输出:我是数组 [0 0 0]
}

// 如果这不是一个空接口,比如是 Duck 那么只要实现了 Duck 接口的所有数据类型都可以传
func test(b Empty)  {		
   switch v:=b.(type) {
   case string:
      fmt.Println("我是字符串", v)
   case int:
      fmt.Println("我是int", v)
   case [3]int:
      fmt.Println("我是数组", v)
   }
}

5、匿名空接口

没有名字的空接口,一般用在形参上


func main() {
   var duck Duck = WhiteDuck{"小白", 15, "男"}
   test(10)
   test("XiaoYang")
   test(duck)
}

// 这叫匿名空接口,所有数据类型都可以往里面传,如果想用原来的结构体还需要类型选择回来才能用
func test(b interface{}) {
   fmt.Println(b)
}

6、实现多个接口


// Duck 定义一个鸭子接口
type Duck interface {
   speak()
   run()
}

type Animal interface {
   eat()
   sleep()
}

// WhiteDuck 定义一个白鸭子结构体
type WhiteDuck struct {
   name string
   age  int
   sex  string
}


// 让白鸭子即实现 Duck 接口也实现了 Animal 接口
func (w WhiteDuck) speak() {
   fmt.Println("白鸭子嘎嘎叫,它的名字叫", w.name)
}

func (w WhiteDuck) run() {
   fmt.Println("白鸭子慢悠悠的走,它的名字叫", w.name) 
}

func (w WhiteDuck) eat() {
   fmt.Println("白鸭子吃饭,它的名字叫", w.name)
}

func (w WhiteDuck) sleep() {
   fmt.Println("白鸭子睡觉,它的名字叫", w.name)
}


func main() {
	var w WhiteDuck = WhiteDuck{}
	var a Animal
	var d Duck

	// 这样的话我的 w 即可以给 a ,也可以给 d
	// 但是一旦转到某个接口上,只能使用该接口的方法,自身属性和自身方法需要类型断言后才能使用
	
	a = w		// w 给了 a ,那么 a 就只能调用 Animal 接口的方法
	a.sleep()
	a.eat()
	
	d = w		// w 给了 d ,那么 a 就只能调用 Duck 接口的方法
	d.run()
	d.speak()
}

7、接口嵌套


type Duck interface {
   Animal    // Duck 嵌套 Animal 接口
   speak()
   run()
}

type Animal interface {
   eat()
   sleep()
}

type WhiteDuck struct {
   name string
   age  int
   sex  string
}


// 这样白鸭子即实现 Duck 接口也实现了 Animal 接口
func (w WhiteDuck) speak() {
   fmt.Println("白鸭子嘎嘎叫,它的名字叫", w.name)
}

func (w WhiteDuck) run() {
   fmt.Println("白鸭子慢悠悠的走,它的名字叫", w.name)
}
func (w WhiteDuck) eat() {
   fmt.Println("白鸭子嘎嘎叫,它的名字叫", w.name)
}

func (w WhiteDuck) sleep() {
   fmt.Println("白鸭子慢悠悠的走,它的名字叫", w.name)
}



func main() {
   var a Animal
   var d Duck
   var w WhiteDuck = WhiteDuck{}

   // w 即可以给 a,也可以给 d
   a = w     // 但是 a 只能调用 Animal 中的两个方法
   a.sleep()
   a.eat()

   d = w     // d 却能调用 Duck 和 Animal 中的四个方法
   d.sleep()
   d.eat()
   d.speak()
   d.run()
}

8、接口零值


func main() {

   var a Animal   // nil 就是说明它是一个引用类型
   // 其内部表示就已经告诉了我们,它里面就存两个值,一个是它的类型,一个是指向具体值的指针

   fmt.Println(a) // 输出:<nil>
}

9、make和new的区别


type WhiteDuck struct {
   name string
   sex  string
   age  int
}

func main() {
   var per1 *WhiteDuck = new(WhiteDuck) // new 是返回指向这个类型的指针
   // 或者是我取 WhiteDuck 的地址,赋值给 per2
   var per2 = &WhiteDuck{}

   fmt.Println(per1)  // 输出:&{  0}
   fmt.Println(per2)  // 输出:&{  0}

   var per3 = make([]int, 3, 4)   // make 是具体的创建引用类型
                           // new 是创建指向这个类型的指针
   var per4 = new([]int)        // 是一个指向切片类型的指针

   fmt.Println(per3)  // 输出:[0 0 0]
   fmt.Println(per4)  // 输出:&[]
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

您可能感兴趣的文档:

--结束END--

本文标题: Go语言的接口详解

本文链接: https://lsjlt.com/news/137684.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go语言的接口详解
    目录1、接口的用途2、类型断言3、类型选择4、空接口5、匿名空接口6、实现多个接口7、接口嵌套8、接口零值9、make和new的区别总结接口就是一系列方法的集合(规范行为) 在面向对...
    99+
    2024-04-02
  • Go语言接口的用法详解
    一、接口的定义和好处 我们都知道接口给类提供了一种多态的机制,什么是多态,多态就是系统根据类型的具体实现完成不同的行为。 以下代码简单说明了接口的作用 package main i...
    99+
    2024-04-02
  • Go语言基础go接口用法示例详解
    目录概述语法定义接口实现接口空接口接口的组合总结 概述 Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,不包含变量。 语法 定义接口 type [接口名] inte...
    99+
    2024-04-02
  • Go语言文档解读:encoding/json.Unmarshaler接口详解
    Go语言文档解读:encoding/json.Unmarshaler接口详解,需要具体代码示例引言:在Go语言中,encoding/json包提供了一系列函数和接口来处理JSON数据的编码和解码操作。其中,json.Unmarshaler接...
    99+
    2023-11-04
    Go语言 encoding/json 接口详解
  • 不同语言中接口与Go语言接口的差异
    不同语言中接口与 Go 语言接口的差异 什么是接口? 接口是一种抽象概念,定义了一组方法或行为,而不需要定义这些方法的具体实现。接口允许程序员定义一组通用的规则或契约,而不管底层实现如...
    99+
    2024-04-12
    接口 go语言 python c#
  • Go语言中io包核心接口示例详解
    目录前言ReaderWriterCloserSeeker组合接口总结前言 IO 操作是我们在编程中不可避免会遇到的,例如读写文件,Go语言的 io 包中提供了相关的接口,定义了...
    99+
    2022-06-07
    io GO 示例 go语言 接口
  • go语言接口是干什么
    go语言接口提供了一种灵活的方式来定义对象的行为,并且可以在不关心具体实现的情况下使用这些对象。通常用于:1、抽象数据类型,可以定义一个抽象的数据类型,该类型可以由不同的具体类型实现;2、依赖注入,可以将一个对象的实现与其使用分离;3、测试...
    99+
    2023-12-11
    go语言
  • Go语言利用接口实现链表插入功能详解
    目录1. 接口定义1.1 空接口1.2 实现单一接口1.3 接口多方法实现2. 多态2.1 为不同数据类型的实体提供统一的接口2.2 多接口的实现3. 系统接口调用4. 接口嵌套5....
    99+
    2024-04-02
  • 使用GO语言接口实现日志记录:教程详解
    日志记录是每个应用程序都需要的一个重要功能。它可以帮助开发人员及时发现并解决应用程序中的问题,提高应用程序的稳定性。在GO语言中,我们可以通过实现一个接口来实现日志记录功能。 下面是一个简单的例子,演示如何使用GO语言接口实现日志记录。 ...
    99+
    2023-06-25
    教程 接口 日志
  • Go语言的接口有什么作用
    本篇内容主要讲解“Go语言的接口有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言的接口有什么作用”吧!Go语言-接口在Go语言中,一个接口类型总...
    99+
    2024-04-02
  • Go语言中的接口怎么使用
    今天小编给大家分享一下Go语言中的接口怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。接口在 Go 语言中,接口是一种...
    99+
    2023-07-04
  • go语言的接口必须大写吗
    go语言的接口不需要大写,但建议将接口的名称大,其原因有:1、接口的可见性取决于其定义是在包外还是包内;2、大写的接口名称更容易被其他包导入和使用,提高了包的可用性和可读性;3、大写的接口名称也更符合Go语言的约定,让代码更易于理解和维护。...
    99+
    2023-07-10
  • 深入探讨Go语言中的接口
    Go语言是一种静态类型的编程语言,拥有一套强大的类型系统。在Go语言中,接口(interface)是一个非常重要的概念,它在实现代码的解耦、提升代码的可复用性等方面起着至关重要的作用。...
    99+
    2024-02-25
    go语言 详解
  • GO语言接口的优势与劣势,你了解吗?
    当今的编程语言越来越多,其中Go语言因其高效、简单、易学等优势而备受青睐。在Go语言中,接口是一种重要的特性。接口在Go语言中扮演着非常重要的角色,是Go语言与其他语言的重要区别之一。 那么,GO语言接口的优势与劣势是什么呢?下面我们来探讨...
    99+
    2023-06-15
    自然语言处理 打包 接口
  • 一文带你了解Go语言中接口的使用
    目录接口接口的实现接口类型变量空接口类型断言类型断言变种 type switch小结接口 在 Go 语言中,接口是一种抽象的类型,是一组方法的集合。接口存在的目的是定义规范,而规范的...
    99+
    2022-12-08
    Go语言接口使用 Go语言接口 Go 接口
  • 详解go语言的并发
    目录1、启动go语言的协程2、runtime.Goexit()方法。立即终止当前的协程3、runtime.GOMAXPROCS()表示go使用几个cpu执行代码4、管道定义和创...
    99+
    2022-06-07
    详解go语言 GO 并发 go语言
  • GO语言中接口和接口型函数的具体使用
    目录前言GO语言中的接口怎么用?使用函数类型实现接口有何好处?GO源码例子前言 今天在编码中,看到了一个非常经典的接口用法如下,于是查阅了相关资料,发现此种写法为接口型函数,本文对此...
    99+
    2023-03-09
    GO语言接口 GO语言接口型函数
  • 分析Go语言接口的设计原则
    目录一、前言二、开闭原则三、依赖倒置原则3.1、什么是依赖倒置原则  3.2、一个耦合度极高的模块关系设计3.3、面向抽象层依赖倒转一、前言 go的interface写起来更自由, ...
    99+
    2024-04-02
  • Go语言接口的嵌套如何使用
    这篇文章主要讲解了“Go语言接口的嵌套如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言接口的嵌套如何使用”吧!在Go语言中,不仅结构体与结构体之间可以嵌套,接口与接口间也可以通...
    99+
    2023-07-06
  • Go语言特性详解:一文了解Go的语言特点
    Go语言特性详解:一文了解Go的语言特点 Go语言是一种由Google开发的静态类型、编译型、并发型,并具有垃圾回收功能的开源编程语言。自2009年发布以来,Go语言因其高效的并发处理...
    99+
    2024-03-05
    并发 快速 静态 go语言 网络编程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作