反射
522 字
3 分钟
反射
反射
pair
type Reader interface { Read()}
type Writer interface { Write()}
type Book struct { Name string}
func (b *Book) Read() { fmt.Println("read book:", b.Name)}
func (b *Book) Write() { fmt.Println("write book:", b.Name)}
func main() { book := &Book{Name: "Go 语言"} // 创建Book对象,name=Go 语言
var r Reader // 多态:Reader r = book r = book
var r1 Reader = book r1.Read()
r.Read()
var w Writer // r = pair<type:*Book, value:Book对象地址> w, ok := r.(Writer) // 检查 r 里面当前保存的真实类型,是否实现了 Writer 接口 if ok { w.Write() } else { fmt.Println("Book is not have write method") }}reflect
type User struct { Name string Age int}
func (this *User) Call() { fmt.Println("User.Call()") fmt.Printf("%v\n", this)}
func reflectNum(arg interface{}) { fmt.Println("reflectNum.type", reflect.TypeOf(arg)) fmt.Println("reflectNum.value", reflect.ValueOf(arg))}
func DoFileAndMethod(input interface{}) { // 获取input的type和value inputType := reflect.TypeOf(input) inputValue := reflect.ValueOf(input) inputKind := inputType.Kind() fmt.Println("input.type:", inputType) fmt.Println("input.value:", inputValue) fmt.Println("inputType.Kind():", inputKind) fmt.Println("reflect.Struct:", reflect.Struct) // 转成对应type,如User对象 // 遍历input对象 if inputType.Kind() != reflect.Struct { fmt.Println("input 不是结构体,不能遍历字段") return } for i := 0; i < inputType.NumField(); i++ { field := inputType.Field(i) value := inputValue.Field(i).Interface()
fmt.Println("field.Name:", field.Name) fmt.Println("field.Value:", value) }}
func main() { var num float64 = 23.4351 reflectNum(num)
var user = User{"zhangsan", 20} reflectNum(user)
DoFileAndMethod(num)}--------------reflectNum.type float64reflectNum.value 23.4351reflectNum.type main.UserreflectNum.value {zhangsan 20}input.type: float64input.value: 23.4351inputType.Kind(): float64reflect.Struct: structinput 不是结构体,不能遍历字段Tag
type Bank struct { Name string `json:"bank_name" desc:"名称"` Addr string `json:"bank_addr" desc:"地址"`}
func findTag(str interface{}) { tag := reflect.TypeOf(str).Elem() for i := 0; i < tag.NumField(); i++ { desc := tag.Field(i).Tag.Get("desc") json := tag.Field(i).Tag.Get("json") fmt.Printf("desc:%s, json:%s\n", desc, json) }}
func main() { spdb := Bank{"SPDB", "Shanghai"} fmt.Println(spdb) findTag(&spdb)}---------------{SPDB Shanghai}desc:名称, json:bank_namedesc:地址, json:bank_addrTag应用
type Movie struct { Title string `json:"title"` Year int `json:"year"` Price float32 `json:"price"` Actors []string `json:"actors"`}
func main() { movie := Movie{"喜剧之王", 2000, 190000, []string{"zhangsan", "lisi"}} jsonStr, err := json.Marshal(movie) if err != nil { fmt.Println("json.Marshal error", err) return } fmt.Printf("jsonStr = %s", jsonStr)}---------------------------jsonStr= {"title":"喜剧之王","year":2000,"price":190000,"actors":["zhangsan","lisi"]}type Movie struct { Title string `json:"title"` Year int `json:"year"` Price float32 `json:"price"` Actors []string `json:"actors"`}
func main() { movie := Movie{"喜剧之王", 2000, 190000, []string{"zhangsan", "lisi"}} fmt.Println(movie) jsonStr, err := json.Marshal(movie) if err != nil { fmt.Println("json.Marshal error", err) return } fmt.Printf("jsonStr = %s\n", jsonStr)
// jsonStr转回结构体,赋值给myMovie myMovie := Movie{} err = json.Unmarshal(jsonStr, &myMovie) if err != nil { fmt.Println("json.Unmarshal error", err) return } fmt.Printf("myMovie = %v\n", myMovie)}------------------{喜剧之王 2000 190000 [zhangsan lisi]}jsonStr = {"title":"喜剧之王","year":2000,"price":190000,"actors":["zhangsan","lisi"]}myMovie = {喜剧之王 2000 190000 [zhang文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章 智能推荐
1
1 变量和常量
golang 1 变量和常量
2
2 输入输出
golang 2 输入输出
3
3 基本数据类型
golang 3 基本数据类型
4
4 数组、切片和Map
golang 4 数组、切片和Map
5
5 判断
golang 5 判断
随机文章 随机推荐