1 前言
说明:interface{}必须是前三者类型
2 代码
/** * @Author: FB * @Description: * @File: testOutput.go * @Version: 1.0.0 * @Date: 2019/6/3 10:38 */ package main import ( "reflect" "fmt" ) type NotknownType struct { s1, s2, s3 string } type NotknownType2 struct { S1, S2, S3 string } //只输出值且属性名小写 func output11(obj NotknownType){ value := reflect.ValueOf(obj) for i := 0; i < value.NumField(); i++ { fmt.Printf("Field %d: %v\n", i, value.Field(i)) } } //只输出属性和值且属性名小写 func output12(obj NotknownType){ value := reflect.ValueOf(obj) t := reflect.TypeOf(obj) for i := 0; i < t.NumField(); i++ { fmt.Println(t.Field(i).Name, "->", value.Field(i).Interface()) } } //只输出值且属性名大写 func output21(obj NotknownType2){ value := reflect.ValueOf(obj) for i := 0; i < value.NumField(); i++ { fmt.Printf("Field %d: %v\n", i, value.Field(i)) } } //只输出属性和值且属性名大写 func output22(obj NotknownType2){ value := reflect.ValueOf(obj) t := reflect.TypeOf(obj) for i := 0; i < t.NumField(); i++ { fmt.Println(t.Field(i).Name, "->", value.Field(i).Interface()) } } //只输出属性和值且属性名大写 func output221(obj NotknownType2){ fmt.Printf("%+v",obj) fmt.Println() } //以下是参数为interface{},和上面四个其它一一对应 func output110(obj interface{}){ value := reflect.ValueOf(obj) for i := 0; i < value.NumField(); i++ { fmt.Printf("Field %d: %v\n", i, value.Field(i)) } } func output120(obj interface{}){ value := reflect.ValueOf(obj) t := reflect.TypeOf(obj) for i := 0; i < t.NumField(); i++ { fmt.Println(t.Field(i).Name, "->", value.Field(i).Interface()) } } func output210(obj interface{}){ value := reflect.ValueOf(obj) for i := 0; i < value.NumField(); i++ { fmt.Printf("Field %d: %v\n", i, value.Field(i)) } } func output220(obj interface{}){ value := reflect.ValueOf(obj) t := reflect.TypeOf(obj) for i := 0; i < t.NumField(); i++ { fmt.Println(t.Field(i).Name, "->", value.Field(i).Interface()) } } func main() { var secret = NotknownType{"Ada", "Go", "Oberon"} var secret2 = NotknownType2{"Ada", "Go", "Oberon"} var map1 = map[string]string{"s1":"Ada", "s2":"Go", "s3":"Oberon"} var slice1 = []string{"Ada", "Go", "Oberon"} var obj interface{} = NotknownType{"Ada", "Go", "Oberon"} var obj2 interface{} = NotknownType2{"Ada", "Go", "Oberon"} //参数是struct fmt.Println("output11只输出值且属性名小写") output11(secret) //报错panic: reflect.Value.Interface: cannot return value obtained from unexported field or method,因为属性是小写,反射拿不到值 //fmt.Println("output12") //output12(secret) fmt.Println("output21只输出值且属性名大写") output21(secret2) fmt.Println("output22只输出属性和值且属性名大写") output22(secret2) fmt.Println() fmt.Println("output221") output221(secret) fmt.Println("output222") output222(secret2) fmt.Println() //参数是interface{} fmt.Println("output110只输出值且属性名小写,参数为interface{}") output110(obj) //报错panic: reflect.Value.Interface: cannot return value obtained from unexported field or method,因为属性是小写,反射拿不到值 //fmt.Println("output120") //output120(obj) fmt.Println("output210只输出值且属性名大写,参数为interface{}") output210(obj2) fmt.Println("output220只输出属性和值且属性名大写,参数为interface{}") output220(obj2) //报错panic: reflect: NumField of non-struct type //output220(map1) fmt.Println("output220 只输出属性和值且属性名大写,输入为struct属性大写") output220(secret2) fmt.Println("遍历map,输出键和值") //输出map键和值 for k,v := range map1{ fmt.Println(k,"->",v) } fmt.Println("遍历slice,输出值") //输出map键和值 for i, v := range slice1{ fmt.Println(i, "->", v) } }
输出:
output11只输出值且属性名小写 Field 0: Ada Field 1: Go Field 2: Oberon output21只输出值且属性名大写 Field 0: Ada Field 1: Go Field 2: Oberon output22只输出属性和值且属性名大写 S1 -> Ada S2 -> Go S3 -> Oberon output221 {s1:Ada s2:Go s3:Oberon} output222 {S1:Ada S2:Go S3:Oberon} output110只输出值且属性名小写,参数为interface{} Field 0: Ada Field 1: Go Field 2: Oberon output210只输出值且属性名大写,参数为interface{} Field 0: Ada Field 1: Go Field 2: Oberon output220只输出属性和值且属性名大写,参数为interface{} S1 -> Ada S2 -> Go S3 -> Oberon output220 只输出属性和值且属性名大写,输入为struct属性大写 S1 -> Ada S2 -> Go S3 -> Oberon 遍历map,输出键和值 s1 -> Ada s2 -> Go s3 -> Oberon 遍历slice,输出值 0 -> Ada 1 -> Go 2 -> Oberon Debugger finished with exit code 0