當前位置: 首頁>>代碼示例>>Golang>>正文


Golang Value.Unmarshal方法代碼示例

本文整理匯總了Golang中reflect.Value.Unmarshal方法的典型用法代碼示例。如果您正苦於以下問題:Golang Value.Unmarshal方法的具體用法?Golang Value.Unmarshal怎麽用?Golang Value.Unmarshal使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在reflect.Value的用法示例。


在下文中一共展示了Value.Unmarshal方法的1個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。

示例1: readObject

func readObject(r Reader, v *reflect.Value) error {
	var err error
	for enc, err := readEncoding(r); err == nil; enc, err = readEncoding(r) {
		name := encodings[*enc]
		// fmt.Println(name, v, v.IsValid(), enc.typ, enc.field)
		switch enc.typ {
		case ST_ARRAY:
			if name == "EndOfArray" {
				return errorEndOfArray
			}
			array := getField(v, enc)
		loop:
			for {
				child := reflect.New(array.Type().Elem()).Elem()
				err := readObject(r, &child)
				switch err {
				case errorEndOfArray:
					break loop
				case errorEndOfObject:
					array.Set(reflect.Append(*array, child))
				default:
					return err
				}
			}
		case ST_OBJECT:
			switch name {
			case "EndOfObject":
				return errorEndOfObject
			case "PreviousFields", "NewFields", "FinalFields":
				leType := LedgerEntryType(v.Elem().FieldByName("LedgerEntryType").Uint())
				le := LedgerEntryFactory[leType]()
				fields := reflect.ValueOf(le)
				v.Elem().FieldByName(name).Set(fields)
				if err := readObject(r, &fields); err != nil && err != errorEndOfObject {
					return err
				}
				// var fields Fields
				// f := reflect.ValueOf(&fields)
				// v.Elem().FieldByName(name).Set(f)
				// if readObject(r, &f); err != nil && err != errorEndOfObject {
				// 	return err
				// }
			case "ModifiedNode", "DeletedNode", "CreatedNode":
				var node AffectedNode
				n := reflect.ValueOf(&node)
				var effect NodeEffect
				e := reflect.ValueOf(&effect)
				e.Elem().FieldByName(name).Set(n)
				v.Set(e.Elem())
				return readObject(r, &n)
			case "Memo":
				var memo Memo
				m := reflect.ValueOf(&memo)
				inner := reflect.ValueOf(&memo.Memo)
				err := readObject(r, &inner)
				v.Set(m.Elem())
				return err
			default:
				return fmt.Errorf("Unexpected object: %s for field: %s", v.Type(), name)
			}
		default:
			if v.Kind() == reflect.Struct {
				return fmt.Errorf("Unexpected object: %s for field: %s", v.Type(), name)
			}
			field := getField(v, enc)
			if !field.CanAddr() {
				return fmt.Errorf("Missing field: %s %+v", name, enc)
			}
			switch v := field.Addr().Interface().(type) {
			case Wire:
				if err := v.Unmarshal(r); err != nil {
					return err
				}
			default:
				if err := read(r, v); err != nil {
					return err
				}
			}
		}
	}
	return err
}
開發者ID:askk,項目名稱:ripple,代碼行數:82,代碼來源:decoder.go


注:本文中的reflect.Value.Unmarshal方法示例由純淨天空整理自Github/MSDocs等開源代碼及文檔管理平台,相關代碼片段篩選自各路編程大神貢獻的開源項目,源碼版權歸原作者所有,傳播和使用請參考對應項目的License;未經允許,請勿轉載。