interface中保存了实际对象的值和类型
func TypeOf(i interface{}) Type
func ValueOf(i interface{}) Value
Settability is determined by whether the reflection object holds the original item
var x float64 = 3.4
fmt.Println(reflect.ValueOf(x).CanSet()) //false
fmt.Println(reflect.ValueOf(&x).CanSet()) //false
fmt.Println(reflect.ValueOf(&x).Elem().CanSet()) //true
reflect.ValueOf(&x).Elem().SetFloat(1.2)
fmt.Println(x) //1.2
//only exported fields of a struct are settable.
type T struct {
A int
b string
}
t := T{A: 1}
s := reflect.ValueOf(&t).Elem()
fmt.Println(s.FieldByName("A").CanSet()) //true
fmt.Println(s.FieldByName("b").CanSet()) //false
s.FieldByName("A").SetInt(123)
fmt.Println(t.A) //123
A value is addressable if it is an element of a slice, an element of an addressable array, a field of an addressable struct, or the result of dereferencing a pointer
参考: http://blog.golang.org/laws-of-reflection