Go:接口 Interface

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")
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值