Day6.interface_reflect

一.接口

(一).interface类型可以定义一组方法,用来表示一个对象的行为特征。interface不能包含任何变量。

1.Golang中的接口 不需要显示的实现,只要一个对象,实现了接口类型中的所有方法,那么这个对象就实现了这个接口。
2.如果一个对象实现了多个interface类型的方法,那么这个对象就实现了多个接口。
3.一种事物的多种形态,都可以按照统一的接口进行操作。
package main

import "fmt"

type Animal interface {
    Eat()
    Talk()
}

type Dog struct {
    Name string
}

func (d *Dog) Eat() {
    fmt.Println(d.Name, "is eating!")
}

func (d *Dog) Talk() {
    fmt.Println(d.Name, "is wangwang!")
}

type Cat struct {
    Name string
}

func (d *Cat) Eat() {
    fmt.Println(d.Name, "is eating!")
}

func (d *Cat) Talk() {
    fmt.Println(d.Name, "is miaomiao!")
}

func Test() {
    var a Animal
    var d Dog
    var c Cat
    d.Eat()
    d.Talk()

    a = &d
    a.Eat()
    a.Talk()

    a = &c
    c.Talk()
    c.Eat()
}

func TestOperator() {
    var animalList []Animal
    d := &Dog{
        Name: "little yellow",
    }
    animalList = append(animalList, d)

    d1 := &Dog{
        Name: "wangcai yellow",
    }
    animalList = append(animalList, d1)

    for _, v := range animalList {
        v.Eat()
        v.Talk()
    }

}
func main() {
    TestOperator()
}

二反射

(一).reflect

1.程序在运行时动态的获取变量信息 import("reflect")
a.reflect.TypeOf 获取变量的类型,返回reflect.Type类型。
b.reflect.ValueOf 获取变量的值,返回reflect.Value类型。
c.reflect.Value.Kind 获取变量的类别返回一个常量。
d.reflect.Value.Interface() 转换成interface{} type.

(二)get value of the variables.

reflect.ValueOf(x).Float()
reflect.ValueOf(x).Int()
reflect.ValueOf(x).String()
reflect.ValueOf(x).Bool()

main.go // 使用反射动态修改变量的值 ```go package main

import ( "fmt" "reflect" )

type Student struct { Name string }

func getValueInfo() { var i int = 100 valueInfo := reflect.ValueOf(&i) valueInfo.Elem().SetInt(200) fmt.Println("type:", valueInfo.Elem().Int()) fmt.Println("type:", valueInfo.Type()) fmt.Println("type:", valueInfo.Kind())

tmp := valueInfo.Interface()
val := tmp.(*int)
fmt.Println(val)

var stu Student
valueInfo = reflect.ValueOf(stu)
fmt.Println("type", valueInfo.Type())
fmt.Println("type", valueInfo.Kind())

}

func main() { getValueInfo() }


### (三) 用反射来操作结构体

```go
a.reflect.Value.NumField()获取结构体中字段的个数。
b.reflect.Value.Method(n).Call来调用结构体中的方法。
package main

import (
    "fmt"
    "reflect"
)

type Student struct {
    Name string
    Age  int
    Sex  int
}

func (s *Student) Set(name string, Age int, Sex int) {
    s.Name = name
    s.Age = Age
    s.Sex = Sex
}

func (s *Student) Get(name string) {
    s.Name = name
}

func testStruct() {
    var stu *Student = &Student{}

    stu.Set("jim", 18, 1)
    valueInfo := reflect.ValueOf(stu)

    fieldNum := valueInfo.Elem().NumField()
    fmt.Println("field name:", fieldNum)

    sexValueInfo := valueInfo.Elem().FieldByName("Sex")
    fmt.Println("sex=", sexValueInfo.Int())

    sexValueInfo.SetInt(201)
    fmt.Println(stu)

    setMethod := valueInfo.MethodByName("Set")
    fmt.Println(setMethod)

    var params []reflect.Value
    name := "Tom"
    age := 1000
    sex := 2

    params = append(params, reflect.ValueOf(name))
    params = append(params, reflect.ValueOf(age))
    params = append(params, reflect.ValueOf(sex))

    setMethod.Call(params)
    fmt.Println(stu)
}

func main() {
    testStruct()
}
Copyright © zhangluya.com 2019            UPDATE 2019-12-06 11:02:42

results matching ""

    No results matching ""