GO学习2 | 青训营

76 阅读2分钟

GO学习2 | 青训营

interface通用万能类型,可以通过interface类型引用任意类型的数据类型,如int、string、float32、float64以及struct。

interface

通用万能类型,可以通过interface类型引用任意类型的数据类型,如int、string、float32、float64以及struct。

interface是如何区分类型的

断言机制:通过x.(类型)方法,会返回value、ok ,ok的值可以判断是否是判断类型如果是true,反之flase。

        func myFunc(x interface{}){
            value,ok :x.(string)
            if !ok{
                fmt.Println("x is not string type")
            }
            else{
                fmt.Println("x is string type,value =",value)
                fmt.Printf("value type is %T\n",value)
            }

变量

在GO语言中,变量由type,value组成。

type

static: 静态类型,基本类型如int、float、string。

concrete:具体数据类型,系统看得见。

可以通过反射可以得到变量类型,

内置的pair

在GO语言中,每个interface变量都有有一个内置的pair用于存放类型type和值value。当一个变量确定了pair,那么之后的每次赋值都会将pair进行传递。

    package main

    import "fmt"

    type Reader interface {
            ReadBook()
    }

    type Writer interface {
            WriteBook()
    }

    //具体类型
    type Book struct {
    }

    func (this *Book) ReadBook() {
            fmt.Println("Read a book.")
    }

    func (this *Book) WriteBook() {
            fmt.Println("Write a book.")
    }

    func main() {
            //b pair<type:Book,value:book{}地址>
            b := &Book{}

            var r Reader
            //通过赋值的方式将b的pair传递给r
            r = b

            r.ReadBook()

            var w Writer
            //通过连续赋值的方式将r的pair传递给w
            w = r.(Writer)
            //
            w.WriteBook()
    }

查看变量pair

可以通过relect包用的TypeOf和ValueOf方法来查看具体的类型和值。

    reflect.TypeOf(xx)
    reflect.ValueOf(xx)

也可以通过Type得到Numfield进行遍历

    //1,获取interface的reflect,Type,通过Type得到NumField,进行遍历
    for i:=0;i<inputType.NumField();i++{
    //2,得到每个f1e1d,数据类型
    field :=  inputType.Field(i)
    //3,通过filed有一个Interface()方法等到对应的value
    value := inputValue.Field(i).interface()
    fmt.Printf("%s:%v =%v\n",field.Name,field.Type,value)
    }

reflect包

基本功能就是TypeOf和ValueOf,用于检测接口变量内部存储的(值value;类型concrete type) pair对的一种机制。这两个方法可以帮助我们很容易的访问变量。

relfect.TypeOf

返回变量具体的类型,如int、float32、float64、String、struct等。

relfect.ValueOf

返回变量具体的值,如100、23.56、“你好”以及结构体。

reflect.Value

当执行reflect.ValueOf(interface)之后,就得到了一个类型为”relfect.Value”变量,可以通过它本身的Interface()方法获得接口变量的真实内容。

reflect.Type

使用 reflect.TypeOf() 函数可以获得任意值的类型对象(reflect.Type),通过类型对象可以访问任意值的类型信息。

总结

当我们需要用到一个变量的类型和值的时候,我们可以调用reflect包里面的TypeOf和ValueOf方法来获取。