Go基础(接口)
Tutorial: Go初级
Category: Go
Published: 2026-04-07 13:58:26
Views: 21
Likes: 0
Comments: 0
package main
import (
"errors"
"fmt"
"reflect"
"strconv"
)
type Cat struct{}
func (c Cat) say() { fmt.Println("喵喵喵") }
type Dog struct{}
func (d Dog) say() { fmt.Println("汪汪汪") }
func f1() {
c1 := Cat{}
c1.say()
d1 := Dog{}
d1.say()
}
type Sayer interface {
say()
}
func f2() {
var x Sayer
c := Cat{}
d := Dog{}
x = c
x.say()
x = d
d.say()
}
type Mover interface {
move()
}
func (d *Dog) move() {
fmt.Println("狗会跑")
}
func f3() {
var x Mover
var jww = &Dog{}
x = jww
x.move()
}
type WashingMaching interface {
wash()
dry()
}
type Dryer struct{}
func (d Dryer) dry() {
fmt.Println("甩一甩")
}
type Haier struct {
Dryer
}
func (c Haier) wash() {
fmt.Println("洗一洗")
}
func f4() {
var x WashingMaching
var h = Haier{}
x = h
x.dry()
x.wash()
}
type Animal interface {
Sayer
Mover
}
func (c *Cat) move() {
fmt.Println("猫会跑")
}
func f5() {
var x Animal
bsm := &Cat{}
x = bsm
x.move()
x.say()
}
func show(a interface{}) {
fmt.Printf("type:%T value:%v\n", a, a)
}
func f6() {
var x interface{}
s := "Hello 沙河"
x = s
fmt.Printf("type:%T value:%v\n", x, x)
i := 100
x = i
fmt.Printf("type:%T value:%v\n", x, x)
b := true
x = b
fmt.Printf("type:%T value:%v\n", x, x)
show(123)
show("helloworld")
}
func interfaceType(x interface{}) {
switch v := x.(type) {
case string:
fmt.Printf("x is a string,value is %v\n", v)
case int:
fmt.Printf("x is a int is %v\n", v)
case bool:
fmt.Printf("x is a bool is %v\n", v)
default:
fmt.Println("unsupport type!")
}
}
func f7() {
var x interface{}
x = "cat"
v, ok := x.(string)
if ok {
fmt.Println(v, ok)
}
interfaceType(x)
}
func Call(m map[string]interface{}, name string, params ...interface{}) (result []reflect.Value, err error) {
f := reflect.ValueOf(m[name])
if len(params) != f.Type().NumIn() {
err = errors.New("The number of params is not adapted.")
return
}
in := make([]reflect.Value, len(params))
for k, param := range params {
in[k] = reflect.ValueOf(param)
}
result = f.Call(in)
return
}
func main() {
funcs := map[string]interface{}{
"f1": f1,
"f2": f2,
"f3": f3,
"f4": f4,
"f5": f5,
"f6": f6,
"f7": f7,
}
for i := 7; i < 8; i++ {
fName := "f" + strconv.Itoa(i)
Call(funcs, fName)
}
}