14 05 2025
package main

import (
"fmt"
)

// 声明接口 接口是一种数据类型 接口可以嵌套 接口里面可以放接口
type IMath interface {
Add(a, b int) int
Sub(a, b int) int
}

// 空接口 表示没有约束 任意类型都可以实现这个接口
type IMath2 interface{}

// 如果接口里面有方法 必须要通过结构体或者自定义类型实现这个接口
type Math struct {
// 这里可以添加一些成员变量
num int
}

// 实现接口方法 接口有几种方法 这里的结构体就要加几种方法
func (m Math) Add(a, b int) int {
//m是值类型 值类型跟结构体都可以赋值给m   *Math需要用指针来赋值
return a + b + m.num
}

func (m Math) Sub(a, b int) int {
return a - b - m.num
}

func main() {
var mathnum = Math{num: 10}

// 实例化接口
var math IMath = mathnum //指针 &mathnum
// 调用接口方法
fmt.Println(math.Add(1, 2))
fmt.Println(math.Sub(3, 2))
//空接口 可以赋值任意类型
var IMath2 IMath2
IMath2 = 2
fmt.Printf("%v,%T\n", IMath2, IMath2)
//空接口也可以直接声明
var IMath3 interface{}
IMath3 = "hello"
IMath3 = 10
IMath3 = true
//无法通过 IMath3[0] 获取值 因为空接口里面没有下标
IMath3 = []int{1, 2, 3}
fmt.Printf("%v,%T\n", IMath3, IMath3)

//空接口可以作为切片以及map的元素类型
var s = []interface{}{1, "hello", true}
fmt.Printf("%v,%T\n", s, s)
var m = map[interface{}]interface{}{}
m[1] = "hello"
m[true] = 10
fmt.Printf("%v,%T\n", m, m)
//判断空接口数据的数据类型
v, ok := m[1].(string)
fmt.Printf("%v,%T,%v\n", ok, ok, ok)
if ok {
fmt.Println(v)
}
//switch 里面 可以用x.(type)来判断x的类型
switch m[1].(type) {
case string:
fmt.Println("string")
case int:
fmt.Println("int")
case bool:
fmt.Println("bool")
default:
fmt.Println("unknown")
}
//空接口可以使用类型断言来获取值
IMath3_v, _ := IMath3.([]int)
fmt.Printf("%v,%T\n", IMath3_v, IMath3_v)
fmt.Println(IMath3_v[0])
}

延伸阅读
学习golang(十)
学习golang(二)
学习golang(三)
学习golang(十一)
学习golang(七)
发表评论
最新|与我有关