灵活的值和其他类型
2018-11-15 本文已影响0人
bocsoft
package main
import "fmt"
//为map定义类型 Values
type Values map[string][]string
//为int64定义类型 MyInt
type MyInt int64
//为类型Values定义方法Get
func (v Values) Get(key string) string {
//转换类型
m := map[string][]string(v)
return m[key][0]
}
//为类型MyInt定义方法Tripple
func (i MyInt) Tripple() int64 {
// 需要类型转换
return int64(i) * 3
}
//定义接口并实现MyInt类型的方法
type MyInterface interface {
Tripple() int64
}
//定义一个空接口
type Object interface {
}
func main() {
a := map[string][]string{
"key1": []string{"1", "2"},
"key2": []string{"3", "4"},
}
//使用为Values定义的Get方法
b := Values(a) //转换为自定义类型
fmt.Println(b.Get("key1")) //1
fmt.Println(b.Get("key2")) //3
//使用为MyInt定义的Tripple 方法
fmt.Println(MyInt(100).Tripple()) //300
//定义一个空接口
var obj Object
//把自定义类型赋值给空接口
obj = b
objB, yes := obj.(Values)
fmt.Println(yes)//true
fmt.Println(objB.Get("key1"))//1
objInt,yes1 := obj.(MyInt)
fmt.Println(yes1)//false
fmt.Println(objInt)//0
var m MyInterface
m = MyInt(9)
fmt.Println(m.Tripple())//27
var myint1 MyInt
myint1 = 102
var myif MyInterface //该接口实现了MyInt类型中的方法
myif = myint1
fmt.Println(myif.Tripple())//306
switch i := obj.(type){
case MyInt:
fmt.Println("x is nil",i)
case Values:
fmt.Println("x is Values",i)//x is Values map[key1:[1 2] key2:[3 4]]
default:
fmt.Println("don't know the type",i)
}
}