变量的结构
1.基本数据类型pair的使用
2.类中pair的使用
3.反射reflect
变量结构
1.基本数据类型
package main
import"fmt"
func basefun(){
//pair<statictype:string,value:"aceld">
var a string
a="aceld"
//pair<type::string,value:"sceld">
//interface这个万能类型
var allType interface{}
allType=a
str,_!=allType.(string)
fmt.Println(str)
}
func osfun(){
//tty:pair<type:*os.File,value:"/dev/tty"文件描述符>
tty,err :=os.OpenFile("/dev/tty",os.O_RDWR,0)
if err !=nil{
fmt.Println("open file error",err)
return
}
//r:pair<type:,value>
//tty:pair<type:*os.File,value:"/dev/tty"文件描述符>
var r io.Reader
r=tty
//w:pair<type:,value>
//tty:pair<type:*os.File,value:"/dev/tty"文件描述符>
var w io.Reader
w=r.(io.Writer)
w.Write([]byte("hello this is a test!\n"))
}
2.类中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")
}
fun main(){
//b:pair<type:Book,value:book()>
b :=&book{}
//r:pair<type:,value:>
var r Reader
//r:pair<type:Book,value:book()>
r=b
r.ReadBook()
}
3.反射 reflect包
辨识当前的数据类型
func Vauleof(i interface()) Value{...}//数据值 0
func Typeof(i interface()) Type{...} //数据类型 nil
3.1反射一个基本类型
package main
import(
"fmt"
"reflect"
)
//反射一个基本类型
func reflectNum(arg interface{}){
fmt.Println("type:",reflect.TypeOf(arg))
fmt.Println("value:",reflect.ValueOf(arg))
}
func mainsimple(){
var num float64 =1.2345
reflectNum(num)
//反射一个复杂类型
}
3.2反射一个复杂的类型
package main
import(
"fmt"
"reflect"
)
type User struct{
Id int
Name string
Age int
}
//打印自己
func(this *User) Call(){
fmt.Println("user is called ..")
fmt.Printf("%v\n",this) //打印自己
}
func main(){
user :=User{1,"Aceld",18}
DoFileAndMethod(user)
}
func DoFileAndMethod(input interface{}){
//1.获取input type 和value
inputType :=reflect.TypeOf(input)
inputValue :=reflect.ValueOf(input)
fmt.Println("inputType is :",inputType.Name())
fmt.Println("inputType is :",inputValue )
//2.通过type 获取字段、方法、调用
for i:=0;i<inputType.NumField();i++ {
field :=inputType.Field(i)
value :=inputValue.Field(i).Interface()
fmt.Printf("%s: %v= %v\n",field.Name, field.Type,value)
}
//通过type 获取里面的方法、调用
for i:=0;i<inputType.NumMethod();i++ {
m :=inputType.Method(i)
fmt.Printf("%s: %v= %v\n",m.Name, m.Type)
}
}