爱摸鱼的Demon
首页
前端知识
后端技术
工程实践
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

爱摸鱼的Demon

我的地盘,欢迎光临。
首页
前端知识
后端技术
工程实践
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • C#

  • Golang

    • Go

      • GO环境安装
      • Hello World GO版
      • GO变量、数据类型与方法
      • GO的基础语法
      • 并发安全与锁
      • channel(通道、管道)
      • 反射
      • 文件目录
      • Golang中的接口(Interface)
    • Gin

    • GORM

  • 后端技术
  • Golang
  • Go
DemonW-X
2025-09-29

Golang中的接口(Interface)

1、定义

golang中的接口是一种抽象数据类型,定义了对象的行为规范,只定义规范不实现,实现由具体的对象来操作。interface是一组函数method的集合,接口不能包含任何变量。

2、空接口

golang中接口可以不定义任何方法,没有定义任何方法的接口叫做空接口。

①空接口表示没有任何约束,任何类型变量都可以实现空接口。

//声明一个空接口(当作类型使用)
var b interface{}
b = 20
fmt.Printf("b值:%v, 类型:%T\n", b, b) //b值:20, 类型:int
b = "over"
fmt.Printf("b值:%v, 类型:%T\n", b, b) //b值:over, 类型:string
b = false
fmt.Printf("b值:%v, 类型:%T\n", b, b) //b值:false, 类型:bool
1
2
3
4
5
6
7
8

②map的值实现空接口

//map的值实现空接口
var m1 = make(map[string]interface{})
m1["username"] = "Jack"
m1["age"] = 26
fmt.Println(m1) //map[age:26 username:Jack]
1
2
3
4
5

③slice的值实现空接口

//slice的值实现空接口
var s1 = make([]interface{}, 0, 10)
s1 = append(s1, "hello world")
s1 = append(s1, 20)
s1 = append(s1, false)
fmt.Println(s1) //[hello world 20 false]
1
2
3
4
5
6

④若空接口中存有切片/结构体,则无法用切片/结构体的方式定位读取到数据。

解决办法:类型断言(见3)

type Address struct{
    Province string
    City string
}

func main{
    var userinfo = make(map[string]interface)
    userinfo["username"] = "zhangsan"
    userinfo["age"] = 20
    userinfo["hobby"] = []string{"睡觉","吃饭"}
    var address = Address{
        Province:"fujian",
        City:"fuzhou",
    }
    userinfo["address"] = address 
    fmt.Println(userinfo["username"]) //zhangsan 
    fmt.Println(userinfo["age"]) //20
    fmt.Println(userinfo["hobby"]) [睡觉 吃饭]
    fmt.Println(userinfo["hobby"][1]) //报错! 空指针不支持索引!
    fmt.Println(userinfo["address"]) {fujian fuzhou}
    fmt.Println(userinfo["address"].Province) //报错!无法获取空接口下的属性
    
    //解决办法
    hobby , _ := userinfo["hobby"].([]string)
    fmt.Println(hobby[1]) //吃饭
    address1, _ := userinfo["address"].(Address)
    fmt.Println(address1.Province) //fujian
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

3、类型断言

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

//语法格式
x.(T)
//x : 表示类型为interface{}的变量
//T : 表示断言x可能是的类型
1
2
3
4

注意:此方法只能结合switch语句使用

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

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

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

编辑 (opens new window)
文件目录
Gin介绍

← 文件目录 Gin介绍→

最近更新
01
Gorm之事务
11-13
02
Gorm之关联进阶版
11-13
03
Gorm之根据外键关联表
11-13
更多文章>
Theme by Vdoing | Copyright © 2022-2025 爱摸鱼的Demon | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式