1、接口:Interface 类型可以定义一组方法,但是这些不需要实现,并且Interface不能包含任何变量。
2、Interface类型默认是一个指针:
type example interface{
Method1 (参数列表) 返回值列表
Method2(参数列表) 返回值列表、
. . . . . .
}
4、接口实现:
a: Golang 中的接口,不需要显式的实现,只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口,因此,golang中没有implent类似的关键字。
b:如果一个变量含有多个interface类型的方法,那么这个变量就实现了多个接口。
5、接口嵌套: 一个接口可以嵌套在另一个接口中。
6、接口类型断言: 由于接口是一般类型,不知道具体类型,如果要转成具体类型可以采用以下方法进行转换:
var t int; var x interface{ }; x = t; y = x.(int)
7、空接口:interface{ } 空接口没有任何方法,所有类型都实现了空接口。
8、判断一个变量是否实现了指定接口:
example : type Stringer interface{
string() string
}
var v Mystruct
if sv, ok := v. (Stringer); ok{
fmt.Println("v implements string(): %s \n ", string() )
}
9、反射:可以在运行时动态获取变量的相关信息,import(“reflect”)
a. reflect.TypeOf 获取变量类型。返回reflect.Type类型
b. reflect.ValueOf 获取变量的值,返回reflect.Value
c. reflect.Value.Kind 获取变量的类别,返回一个常量
d. reflect.Value.Interface() 转换成interface{ }类型
获取变量的值:
reflect.ValueOf(x).Float( )
reflect.ValueOf(x).Int( )
reflect.ValueOf(x).String( )
reflect.ValueOf(x).Bool( )
10、用反射操作结构体
a. reflect.Value.NumField( )获取结构体中字段的个数
b. reflect.Value.Method(n).Call来调用结构体中的方法
Example:
data, err := ioutil.ReadFile("./dv-bcs.json")
if err != nil {
fmt.Println(err)
}
var dv interface{}
err = json.Unmarshal(data, &dv)
if err != nil {
fmt.Println("unmarshal err", err)
}
//使用断言判断类型
m := t.(map[string]interface{})
for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, "is string", vv)
case int:
fmt.Println(k, "is int", vv)
case float64:
fmt.Println(k, "is float64", vv)
case bool:
fmt.Println(k, "is bool", vv)
case []interface{}: //slice类型的元素为interface{}接收
fmt.Println(k, "is an array:")
for i, u := range vv {
fmt.Println(i, u)
}
default:
fmt.Println(k, "is of a type I don't know to handle")
}
}