亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何減少 Go 中將基本類型轉換為字符串的函數中的代碼重復

如何減少 Go 中將基本類型轉換為字符串的函數中的代碼重復

Go
牛魔王的故事 2022-12-13 16:15:25
我在 Go (1.18.1) 中編寫了一個簡單的函數,它將any(ak interface{}) 類型作為輸入并將值作為字符串返回,如果是指針nil,函數返回"nil";如果不支持該類型,則函數返回"?"// small helper funcion which is usefull when printing (pointer) valuesfunc ToString(T any) string {    switch v := T.(type) {    case string:        return v    case *string:        if v == nil {            return "nil"        } else {            return *v        }    case int:        return strconv.FormatInt(int64(v), 10)    case int8:        return strconv.FormatInt(int64(v), 10)    case int16:        return strconv.FormatInt(int64(v), 10)    case int32:        return strconv.FormatInt(int64(v), 10)    case int64:        return strconv.FormatInt(v, 10)    case float32:        return fmt.Sprintf("%f", v)    case float64:        return fmt.Sprintf("%f", v)    case *int:        if v == nil {            return "nil"        }        return strconv.FormatInt(int64(*v), 10)    case *int8:        if v == nil {            return "nil"        }        return strconv.FormatInt(int64(*v), 10)    case *int16:        if v == nil {            return "nil"        }        return strconv.FormatInt(int64(*v), 10)    case *int32:        if v == nil {            return "nil"        }        return strconv.FormatInt(int64(*v), 10)    case *int64:        if v == nil {            return "nil"        }        return strconv.FormatInt(*v, 10)    case *float32:        if v == nil {            return "nil"        }        return fmt.Sprintf("%f", *v)    case *float64:        if v == nil {            return "nil"        }        return fmt.Sprintf("%f", *v)    case *bool:        if v == nil {            return "nil"        }    case bool:        if v == true {            return "true"        }        return "false"    }    return "?"}這完美地完成了它的工作,但是看看實際的算法,我對代碼重復的數量感到惱火,不幸的是 afallthrough在類型切換語句中不起作用(請參閱為什么在類型切換中不允許 fallthrough?)。有沒有更有效的方法(即代碼重復更少)來完成與上述ToString(T any)功能相同的事情?
查看完整描述

1 回答

?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

更短的代碼反映:


func ToString(x any) string {

    v := reflect.ValueOf(x)

    if v.Kind() == reflect.Ptr {

        if v.IsZero() {

            return "nil"

        }

        v = v.Elem()

    }


    switch v.Kind() {

    case reflect.String:

        return v.String()

    case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:

        return strconv.FormatInt(v.Int(), 10)

    case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:

        return strconv.FormatUint(v.Uint(), 10)

    case reflect.Float32, reflect.Float64:

        return strconv.FormatFloat(v.Float(), 'f', -1, v.Type().Bits())

    case reflect.Bool:

        return strconv.FormatBool(v.Bool())

    default:

        return "?"

    }

}


查看完整回答
反對 回復 2022-12-13
  • 1 回答
  • 0 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號