1    package main
     2    
     3    import (
     4        "fmt"
     5        "reflect"
     6    )
     7    
     8    func main() {
     9        i := 0
    10        fmt.Println(reflect.ValueOf(i).CanSet())         // false: 值传递, 拷贝, 修改无意义, 所以结果为 false
    11        fmt.Println(reflect.ValueOf(&i).CanSet())        // false: 注意此时参数是指向 i 的指针, 修改这个指针依然是没有意义的
    12        fmt.Println(reflect.ValueOf(&i).Elem().CanSet()) // true: 如果我们想修改 i, 则需要先获取指针指向的元素
    13    
    14        // reflect.ValueOf(i).Set(1)    遵循 Go 的哲学, 在遇到此类无意义的操作时, 直接 panic, 而不是沉默
    15    
    16        reflect.ValueOf(&i).Elem().SetInt(1)
    17        fmt.Println(i) // 1
    18    }
    19    
    20    // [The Laws of Reflection](https://go.dev/blog/laws-of-reflection)
    21    // 1. Reflection goes from interface value to reflection object.
    22    // 2. Reflection goes from reflection object to interface value.
    23    // 3. To modify a reflection object, the value must be settable.
    24    //
    25    // 对于第一条, Go 会自动将参数转为 any.