Golang interface{}的具体使用

 更新时间:2025年05月23日 11:15:18   作者:gopher.guo  
interface{}是Go中可以表示任意类型的空接口,本文主要介绍了Golang interface{}的具体使用,具有一定的参考价值,感兴趣的可以了解一下

一、什么是 interface{}?

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

定义形式:

interface{}

等价于:

type interface{} 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.Pointer  // 指向实际数据的指针
}

比如:

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{}内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang批量执行任务的通用模板分享

    golang批量执行任务的通用模板分享

    这篇文章主要为大家详细介绍了golang实现批量执行任务的通用模板,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-11-11
  • 关于Go语言中特有的设计模式与实现方式讲解

    关于Go语言中特有的设计模式与实现方式讲解

    虽然Go语言没有像其他语言那样明确的设计模式,但在实践中,开发者们仍然发现了一些在Go语言中特别适用的设计模式和实现方式,本文就来和大家一一进行讲解
    2023-05-05
  • 以go为例探究beyla从环境变量BEYLA_OPEN_PORT发现进程原理

    以go为例探究beyla从环境变量BEYLA_OPEN_PORT发现进程原理

    这篇文章主要为大家介绍了以golang进程为例,研究beyla从环境变量BEYLA_OPEN_PORT(即通过端口)发现进程的原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • GO语言入门学习之基本数据类型字符串

    GO语言入门学习之基本数据类型字符串

    字符串在Go语言中以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样,下面这篇文章主要给大家介绍了关于GO语言入门学习之基本数据类型字符串的相关资料,需要的朋友可以参考下
    2022-04-04
  • go语言通过反射获取和设置结构体字段值的方法

    go语言通过反射获取和设置结构体字段值的方法

    这篇文章主要介绍了go语言通过反射获取和设置结构体字段值的方法,实例分析了Go语言反射的使用技巧,需要的朋友可以参考下
    2015-03-03
  • Go语言基于Goroutine的超时控制方案设计与实践

    Go语言基于Goroutine的超时控制方案设计与实践

    Go语言因其并发特性而备受青睐,尤其是goroutine和channel的组合,像一对默契的搭档,为开发者提供了轻量、高效的并发工具,下面我们来看看基于goroutine的超时控制方案吧
    2025-05-05
  • Go重写http请求重定向的方法

    Go重写http请求重定向的方法

    当使用Go语言进行 HTTP 请求时,默认情况下,http.Client 会自动处理服务器返回的重定向响应(3xx 状态码),本文将详细介绍如何在 Go 中实现禁止 HTTP 请求的重定向、限制重定向次数以及添加自定义重定向策略,需要的朋友可以参考下
    2024-08-08
  • 手把手带你走进Go语言之条件表达式

    手把手带你走进Go语言之条件表达式

    条件表达式由条件运算符构成,并常用条件表达式构成一个赋值语句,本文给大家介绍了在Go语言中条件表达式的具体用法,讲述的非常详细,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • 我放弃Python转Go语言的9大理由(附优秀书籍推荐)

    我放弃Python转Go语言的9大理由(附优秀书籍推荐)

    这篇文章主要给大家介绍了关于我放弃Python转Go语言的9大理由,以及给大家推荐了6本优秀的go语言书籍,对同样想学习golang的朋友们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • golang中sync.Mutex的实现方法

    golang中sync.Mutex的实现方法

    本文主要介绍了golang中sync.Mutex的实现方法,mutex 主要有两个 method: Lock() 和 Unlock(),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论