GOにstring
をreflect.Kind
に基づいて正しい値に変換する汎用ヘルパーメソッドがありますか?文字列の値を正しいreflect.Kindに変換する方法?
または、すべての種類のスイッチを自分で実装する必要はありますか?
私は文字列として "143"のような値を持ち、種類は "UInt16"のreflect.Valueを持ち、その文字列値を変換してそれを私の構造体のUInt16値に設定するのが好きです。
私の現在のコードは次のようになります。
func setValueFromString(v reflect.Value, strVal string) error {
switch v.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
val, err := strconv.ParseInt(strVal, 0, 64)
if err != nil {
return err
}
if v.OverflowInt(val) {
return errors.New("Int value too big: " + strVal)
}
v.SetInt(val)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
val, err := strconv.ParseUint(strVal, 0, 64)
if err != nil {
return err
}
if v.OverflowUint(val) {
return errors.New("UInt value too big: " + strVal)
}
v.SetUint(val)
case reflect.Float32:
val, err := strconv.ParseFloat(strVal, 32)
if err != nil {
return err
}
v.SetFloat(val)
case reflect.Float64:
val, err := strconv.ParseFloat(strVal, 64)
if err != nil {
return err
}
v.SetFloat(val)
case reflect.String:
v.SetString(strVal)
case reflect.Bool:
val, err := strconv.ParseBool(strVal)
if err != nil {
return err
}
v.SetBool(val)
default:
return errors.New("Unsupported kind: " + v.Kind().String())
}
return nil
}
これはすでに動作しますが、これはすでにどこか別の場所に実装されているのだろうか。
申し訳ありませんが、私は明確ではなかった場合。私も同様に質問を編集します。私は "143"のような文字列とreflect.Valueのような種類の "UInt16"とその文字列の値を変換し、私の構造体のUInt16値に設定するように – Tarion
@タリオン編集された答えを参照してください。 – icza