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方法来获取。