golang 笔记13 interface
- interface 基础
一个变量如果实现了接口中定义的所有方法 那么这个变量可以理解为这种接口类型的变量
package interface_demo
import (
"fmt"
"testing"
)
// 定义接口
type speaker interface {
speak() // 只要实现了 speak 方法的变量都是 speaker 类型
}
type dog struct{ name string }
type cat struct{ age int }
func (d dog) speak() {
fmt.Println(d.name, ":汪汪汪")
}
func (c cat) speak() {
fmt.Println("喵喵喵", c.age)
}
// 使用接口
func call(sp speaker) {
sp.speak()
}
// 调用接口方法
func TestInterfaceDemo1(t *testing.T) {
var c1 cat
c1.age = 12
call(c1)
var d1 dog
d1.name = "dico"
call(d1)
var sp speaker
sp = c1
sp.speak()
}
- 空接口
// interface{} 空接口类型
type blank interface{} // 所有类型都实现了空接口 即所有类型都相当于这种接口类型的变量
// 空接口 作为入参
func BlankInterfaceDemo1(param interface{}) {
fmt.Println(param)
}
// 空接口列表
func BlankInterfaceDemo2(params ...interface{}) {
for i, v := range params {
fmt.Println(i, v)
}
}
// 空接口 作为 map 的 value
func BlankInterfaceDemo3() {
var interMap map[string]interface{} = map[string]interface{}{}
interMap["hello"] = 514
interMap["world"] = "world"
interMap["mc"] = time.Now()
interMap["xx"] = 's'
fmt.Println(interMap)
}
- 类型断言
/*
x.(T)
x : 类型为 interface{} 的变量
T : 表示断言 x 可能的类型
*/
func interface_demo4(param interface{}) {
value, ok := param.(string)
if !ok {
fmt.Println("param not is string:", param)
return
}
fmt.Printf("param is string: %s\n", value)
}
// 不建议使用
func interface_demo5(param interface{}) {
switch t := param.(type) {
case int:
fmt.Println("is int -> ", t)
case string:
fmt.Println("is string -> ", t)
case bool:
fmt.Println("is bool -> ", t)
case float64:
fmt.Println("is float -> ", t)
// ...
}
}
func TestBlankInterfaceDemo4(t *testing.T) {
interface_demo4("hello")
interface_demo4(1024)
interface_demo5("world")
interface_demo5(1024)
interface_demo5(true)
interface_demo5(3.1415926)
}