我的编程空间,编程开发者的网络收藏夹
学习永远不晚

golang中的空接口使用详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

golang中的空接口使用详解

1、空接口

Golang 中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。空接口表示,没有任何约束,因此任何类型变量都可以实现空接口。空接口在实际项目中用的是非常多的,用空接口可以表示任意数据类型


func main() {
// 定义一个空接口 x, x 变量可以接收任意的数据类型
var x interface{}
s := "你好 golang"
x = s
fmt.Printf("type:%T value:%v\n", x, x)
i := 100
x = i
fmt.Printf("type:%T value:%v\n", x, x)
b := true
x = b
fmt

1 、空接口作为函数的参数: 使用空接口实现可以接收任意类型的函数参数


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

2 、map 的值 实现空接口: 使用空接口实现可以保存任意值的字典


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

3 、切片实现空接口


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

2、类型断言

一个接口的值(简称接口值)是由一个具体类型和具体类型的值两部分组成的。这两部分分

别称为接口的动态类型和动态值。

如果我们想要判断空接口中值的类型,那么这个时候就可以使用类型断言,其语法格式:x.(T)

其中:

• x : 表示类型为 interface{}的变量

• T : 表示断言 x 可能是的类型。

该语法返回两个参数,第一个参数是 x 转化为 T 类型后的变量,第二个值是一个布尔值,若

为 true 则表示断言成功,为 false 则表示断言失败

例如:


func main() {
var x interface{}
x = "Hello golnag"
v, ok := x.(string)
if ok {
fmt.Println(v)
} else {
fmt.Println("类型断言失败")
}
}

上面的示例中如果要断言多次就需要写多个 if 判断,这个时候我们可以使用 switch 语句来

实现:

注意:类型.(type)只能结合 switch 语句使用


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)
default:
fmt.Println("unsupport type!")
}
}

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

关于接口需要注意的是: :只有当有两个或两个以上的具体类型必须以相同的方式进行处理时

才需要定义接口。不要为了接口而写接口,那样只会增加不必要的抽象,导致不必要的运行

时损耗。

3、结构体值接收者和指针接收者实现接口的区别

值接收者:

如果结构体中的方法是值接收者,那么实例化后的结构体值类型和结构体指针类型都可以赋

值给接口变量


package main
import "fmt"
type Usb interface {
Start()
Stop()
}
type Phone struct {
Name string
}
func (p Phone) Start() {
fmt.Println(p.Name, "开始工作")
}
func (p Phone) Stop() {
fmt.Println("phone 停止")
}
func main() {
phone1 := Phone{
Name: "小米手机",
}
var p1 Usb = phone1 //phone1 实现了 Usb 接口 phone1 是 Phone 类型
p1.Start() //小米手机 开始工作
phone2 := &Phone{
Name: "苹果手机",
}
var p2 Usb = phone2 //phone2 实现了 Usb 接口 phone2 是 *Phone 类型
p2.Start() //苹果手机 开始工作
}

指针接收者:

如果结构体中的方法是指针接收者,那么实例化后结构体指针类型都可以赋值给接口变量,

结构体值类型没法赋值给接口变量


package main
import "fmt"
type Usb interface {
Start()
Stop()
}
type Phone struct {
Name string
}
func (p *Phone) Start() {
fmt.Println(p.Name, "开始工作")
}
func (p *Phone) Stop() {
fmt.Println("phone 停止")
}
func main() {

//正确写法
phone2 := &Phone{
Name: "苹果手机",
}
var p2 Usb = phone2 //phone2 实现了 Usb 接口 phone2 是 *Phone 类型
p2.Start() //苹果手机 开始工作
}

4、一个结构体实现多个接口

Golang 中一个结构体也可以实现多个接口


package main
import "fmt"
type AInterface interface {
GetInfo() string
}
type BInterface interface {
SetInfo(string, int)
}
type People struct {
Name string
Age int
}
func (p People) GetInfo() string {
return fmt.Sprintf("姓名:%v 年龄:%d", p.Name, p.Age)
}
func (p *People) SetInfo(name string, age int) {
p.Name = name
p.Age = age
}
func main() {
var people = &People{
Name: "张三",
Age: 20,
}
// people 实现了 AInterface 和 BInterface
var p1 AInterface = people
var p2 BInterface = people
fmt.Println(p1.GetInfo())
p2.SetInfo("李四", 30)
fmt.Println(p1.GetInfo())
}

5、接口嵌套

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


package main
import "fmt"
type SayInterface interface {
say()
}
type MoveInterface interface {
move()
}
// 接口嵌套
type Animal interface {
SayInterface
MoveInterface
}
type Cat struct {
name string
}
func (c Cat) say() {
fmt.Println("喵喵喵")
}
func (c Cat) move() {
fmt.Println("猫会动")
}
func main() {
var x Animal
x = Cat{name: "花花"}
x.move()
x.say()
}

6、Golang中空接口和类型断言使用细节

使用空接口定义一个map类型的数据,其数据中是切片或者结构体,其通过索引拿到对应切片内容的值,出现错误,必须通过类型断言的形式拿到对应的数据,结构体同理,案例如下:


package main

import "fmt"

type Address struct {
 Name string
 Phone int
}

// Golang中空接口和类型断言使用细节
func main() {

 var userinfo = make(map[string]interface{})
 userinfo["username"] = "张三"
 userinfo["age"] = 20
 userinfo["hobby"] = []string{"睡觉", "吃饭"}

 fmt.Println(userinfo["age"])
 fmt.Println(userinfo["hobby"])

 // fmt.Println(userinfo["hobby"][1]) //interface {} does not support indexing

 var address = Address{
 Name: "李四",
 Phone: 1521242141,
 }
 fmt.Println(address.Name) //李四

 userinfo["address"] = address

 fmt.Println(userinfo["address"]) //{李四 1521242141}

 // var name = userinfo["address"].Name //type interface {} is interface with no methods
 // fmt.Println(name)

 hobby2, _ := userinfo["hobby"].([]string)

 fmt.Println(hobby2[1]) //吃饭

 address2, _ := userinfo["address"].(Address)
 fmt.Println(address2.Name, address2.Phone) //李四 1521242141

}

到此这篇关于golang中的空接口使用的文章就介绍到这了,更多相关golang空接口使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

golang中的空接口使用详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

golang中的空接口怎么用

这篇文章给大家分享的是有关golang中的空接口怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、空接口Golang 中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。空接口表示,没有任何约束,
2023-06-14

Golang开发之接口的具体使用详解

在Golang中,接口是一种类型,它是由一组方法签名组成的抽象集合。这篇文章主要为大家介绍了Golang接口的具体使用,希望对大家有所帮助
2023-05-14

Golang接口的定义与空接口及断言怎么使用

这篇文章主要讲解了“Golang接口的定义与空接口及断言怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang接口的定义与空接口及断言怎么使用”吧!1. Golang中的接口在G
2023-07-06

Golang接口的定义与空接口及断言的使用示例

在 Golang 中,接口是一种类型,它是由一组方法签名组成的抽象集合。这篇文章主要为大家介绍了Golang接口的具体使用,希望对大家有所帮助,空接口是特殊形式的接口类型,普通的接口都有方法,而空接口没有定义任何方法口,也因此,我们可以说所有类型都至少实现了空接口
2023-05-15

Golang拾遗之指针和接口的使用详解

拾遗主要是收集和golang相关的琐碎知识,这篇文章主要是为大家整理了Golang中指针和接口的使用方法,文中的示例代码讲解详细,需要的可以参考一下
2023-02-20

golang空接口的用途是什么

Golang的空接口(interface{})可以接受任意类型的值作为参数,因此可以用于以下几种情况:参数类型不确定:当函数或方法需要接受任意类型的参数时,可以使用空接口作为参数类型。这样可以灵活地传递不同类型的值,类似于其他语言中的泛型。
golang空接口的用途是什么
2024-02-29

Golang接口的定义和用法详解

Golang接口的定义和用法详解在Go语言中,接口(interface)是一种定义对象行为、抽象对象的方法集合的类型。接口定义了对象应该具备的方法,而不需要指定这些方法是如何实现的。这种灵活性使得接口成为Go语言中非常强大和常用的特性之一
Golang接口的定义和用法详解
2024-03-06

Spring BeanPostProcessor接口使用详解

Spring中提供了很多PostProcessor供开发者进行拓展,例如:BeanPostProcessor、BeanFactoryPostProcessor、BeanValidationPostProcessor等一系列后处理器。他们的使
2023-05-30

SpringBoot使用RESTful接口详解

RESTful是一种web软件风格,它不是标准也不是协议,它不一定要采用,只是一种风格,它倡导的是一个资源定位(url)及资源操作的风格,这篇文章主要介绍了SpringBoot使用RESTful接口
2022-11-13

解析Golang中接口的使用场景和注意事项

Golang中接口的使用场景和注意事项解析Golang作为一门静态类型语言,引入了接口(interface)的概念,以便更好地支持面向对象的编程方式。接口在Golang中是一个非常重要的概念,在实际开发中经常用到。本文将从使用场景和注意事
解析Golang中接口的使用场景和注意事项
2024-01-24

Golang中指针的使用详解

Golang是一门支持指针的编程语言,指针是一种特殊的变量,存储了其他变量的地址。通过指针,可以在程序中直接访问和修改变量的值,避免了不必要的内存拷贝和传递。Golang中的指针具有高效、安全的特点,在并发编程和底层系统开发中得到广泛应用
2023-05-18

SpringBootApplicationContextAware拓展接口使用详解

当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象
2023-05-14

实例演示:Golang中接口的使用技巧

Golang中接口的使用技巧Golang(又称Go语言)作为一门快速、简单、高效的编程语言,其接口机制是其特色之一。接口是一种抽象的类型,在Golang中广泛使用,可以提高代码的灵活性和可维护性。本文将通过实例演示Golang中接口的使用
实例演示:Golang中接口的使用技巧
2024-02-22

golang的接口怎么定义使用

这篇文章主要讲解了“golang的接口怎么定义使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang的接口怎么定义使用”吧!在golang中,接口是一种类型,是用来将对方法进行一个收
2023-07-04

Java中如何使用Callable和Future接口详解

本篇文章给大家分享的是有关Java中如何使用Callable和Future接口详解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Runnable是一个接口,而Thread是Ru
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录