感觉 golang 比 Java 还难读, 难学

查看 25|回复 0
作者:wuhaoecho   
要解析的 json, 格式不完美. 比如
[{
"name": "Abyssin",
"price": 500,
"location": "Lviv",
"image": "https://olxua-ring02.akamaized.net/images_slandocomua/476948786_2_1000x700_abissenysh-chempion-fotografii.jpg"
},
{
"name": "Abyssin",
"price": "550",
"location": "Lviv",
"image": "https://olxua-ring10.akamaized.net/images_slandocomua/342850976_3_1000x700_abidetki-koti_rev006.jpg"
}]
price 实际上是个 int 但是有些值是 string. 加 tag 就没啥用了, 只能自己写 UnmarshalJSON
好奇看了一下
json/decode
// indirect walks down v allocating pointers as needed,
// until it gets to a non-pointer.
// If it encounters an Unmarshaler, indirect stops and returns that.
// If decodingNull is true, indirect stops at the first settable pointer so it
// can be set to nil.
func indirect(v reflect.Value, decodingNull bool) (Unmarshaler, encoding.TextUnmarshaler, reflect.Value) {
        // Issue #24153 indicates that it is generally not a guaranteed property
        // that you may round-trip a reflect.Value by calling Value.Addr().Elem()
        // and expect the value to still be settable for values derived from
        // unexported embedded struct fields.
        //
        // The logic below effectively does this when it first addresses the value
        // (to satisfy possible pointer methods) and continues to dereference
        // subsequent pointers as necessary.
        //
        // After the first round-trip, we set v back to the original value to
        // preserve the original RW flags contained in reflect.Value.
        v0 := v
        haveAddr := false
        // If v is a named type and is addressable,
        // start with its address, so that if the type has pointer methods,
        // we find them.
        if v.Kind() != reflect.Pointer && v.Type().Name() != "" && v.CanAddr() {
                haveAddr = true
                v = v.Addr()
        }
        for {
                // Load value from interface, but only if the result will be
                // usefully addressable.
                if v.Kind() == reflect.Interface && !v.IsNil() {
                        e := v.Elem()
                        if e.Kind() == reflect.Pointer && !e.IsNil() && (!decodingNull || e.Elem().Kind() == reflect.Pointer) {
                                haveAddr = false
                                v = e
                                continue
                        }
                }
                if v.Kind() != reflect.Pointer {
                        break
                }
                if decodingNull && v.CanSet() {
                        break
                }
                // Prevent infinite loop if v is an interface pointing to its own address:
                //     var v interface{}
                //     v = &v
                if v.Elem().Kind() == reflect.Interface && v.Elem().Elem() == v {
                        v = v.Elem()
                        break
                }
                if v.IsNil() {
                        v.Set(reflect.New(v.Type().Elem()))
                }
                if v.Type().NumMethod() > 0 && v.CanInterface() {
                        if u, ok := v.Interface().(Unmarshaler); ok {
                                return u, nil, reflect.Value{}
                        }
                        if !decodingNull {
                                if u, ok := v.Interface().(encoding.TextUnmarshaler); ok {
                                        return nil, u, reflect.Value{}
                                }
                        }
                }
                if haveAddr {
                        v = v0 // restore original value after round-trip Value.Addr().Elem()
                        haveAddr = false
                } else {
                        v = v.Elem()
                }
        }
        return nil, nil, v
}
感觉 java 感觉清爽很多. java 感觉不需要学, 看看 ArrayList HashMap 这些接口就可以写了,语法也比较简单. golang 真是各种奇技淫巧满天飞.
您需要登录后才可以回帖 登录 | 立即注册

返回顶部