Golang interface{}的具体使用

2025-05-23 15:50
文章标签 golang interface 具体 使用

本文主要是介绍Golang interface{}的具体使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Golanginterface{}的具体使用》interface{}是Go中可以表示任意类型的空接口,本文主要介绍了Golanginterface{}的具体使用,具有一定的参考价值,感兴趣的可以了...

一、什么是 interface{}?

在 Go 语言中,interface{} 是一种空接口(empty interface),它表示任意类型。因为它没有定义任何方法,所以 所有类型都实现了它

定义形式:

interface{}

等价于:

type interfacejavascript{} interface {}

二、interface{} 有什么特别的?

✅ 特点:

  • 所有类型都实现了 interface{}

  • 可以用来存储任意类型的值

  • 是 Go 的万能类型容器,类似于其他语言里的 Object 或 any

三、使用示例

1. 存储任意类型的值:

func printAnything(v interface{}) {
    fmt.Println("值是:", v)
}
​
func main() {
    printAnything(123)
    printAnything("hello")
    printAnything([]int{1, 2, 3})
}

输出:

值是:123
值是:hello
值是:[1 2 3]

四、底层原理:interface{} 是怎么存值的?

Go 编译器将 interface{} 实际存储为两部分:

type eface struct {
    _type *_type      // 真实类型信息
    data  unsafe.PChina编程ointer  // 指向实际数据的指针
}iWQFpQTyI

比如:

var a interface{} = 123

这时候:

  • _type:指向 int 的类型描述符;

  • data:指向 123 这个 int 的值。

五、怎么取出 interface{} 中的值?

1. 类型断言(Type Assertion):

var a interface{} = "hello"
​
str, ok := a.(string)
if ok {
    fmt.Println("转换成功:", str)
} else {
    fmt.Println("转换失败")
}

2. 使用类型分支(Type Switch):

var a interface{} = 3.14
​
switch v := a.(type) {
case int:
    fmt.Println("是 int:", v)
case float64:
    fmt.Println("是 float64:", v)
case string:
    fmt.Println("是 string:", v)
default:
    fmt.Println("未知类型")
}

六、常见使用场景

场景描述
jsON 解析map[string]interface{} 可以存储任意结构
fmt.Println接收的是 ...interface{} 参数编程
任意类型传参写通用工具函数,允许接收任意类型
空值或未知类型变量当不知道变量类型时,先存为 interface{}

七、注意事项 

  • interface{} 存进去什么类型,取出来的时候必须断言正确,否则运行时报错。

  • interface{} 本身不能直接做加减乘除等运算,必须先类型断言。

  • 不等于 JavaScript 的 any,Go 仍然是强类型语言,类型断言很重要。

  • interface{} 不能直接比较,除非内部类型支持 ==

八、面试常考问答 

Q:interface{} 是不是万能的?

A:它可以存储任何类型的值,但你不能随便操作这些值,除非你知道它的真实类型,并且使用类型断言来还原它。

Q:interface{} 和 interface 的区别?

A:interface{} 是一种接口类型,没有定义任何方法;而普通的接口比如 Writer interface { Write(p []byte) (n int, err error) } 定义了方法,只有实现这些方法的类型才能赋值给该接口。

九、总结一句话:

interface{} 是 Go 中可以表示任意类型的“空接口”,是实现泛型编程的基础工具之一。

到此这篇关于golang interface{}的具体使用的文章就介绍到这了,更多相关Golang interface{}内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Golang interface{}的具体使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154749

相关文章

golang中slice扩容的具体实现

《golang中slice扩容的具体实现》Go语言中的切片扩容机制是Go运行时的一个关键部分,它确保切片在动态增加元素时能够高效地管理内存,本文主要介绍了golang中slice扩容的具体实现,感兴趣... 目录1. 切片扩容的触发append 函数的实现2. runtime.growslice 函数gro

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

java中XML的使用全过程

《java中XML的使用全过程》:本文主要介绍java中XML的使用全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录什么是XML特点XML作用XML的编写语法基本语法特殊字符编写约束XML的书写格式DTD文档schema文档解析XML的方法​​DOM解析XM

使用Java实现Navicat密码的加密与解密的代码解析

《使用Java实现Navicat密码的加密与解密的代码解析》:本文主要介绍使用Java实现Navicat密码的加密与解密,通过本文,我们了解了如何利用Java语言实现对Navicat保存的数据库密... 目录一、背景介绍二、环境准备三、代码解析四、核心代码展示五、总结在日常开发过程中,我们有时需要处理各种软