我有以下功能。我想通過 object interface{} 引數回傳 *string。如果 json.Unmarshal 失敗
我嘗試了很多變體,但從呼叫函式中它仍然是空白的。雖然物件在外面顯示的型別是“string*”,但它是空的。我怎樣才能做到這一點?
我的實際代碼如下。但是,為了簡單起見,這里有一個更簡單的版本。
https://go.dev/play/p/nnsKZxvU42M
// UnmarshalObject decodes an object from binary data
func UnmarshalObject(data []byte, object interface{}) error {
err := json.Unmarshal(data, object)
if err != nil {
s := string(data)
object = &s
}
return nil
}
被這樣稱呼
func (connection *DbConnection) GetObject(bucketName string, key []byte, object interface{}) error {
// ...
err = UnmarshalObject(data, object)
return err
}
從這個函式
// DBVersion retrieves the stored database version.
func (service *Service) DBVersion() (int, error) {
var version string
err := service.connection.GetObject(BucketName, []byte(versionKey), &version)
if err != nil {
return 0, err
}
return strconv.Atoi(version)
}
在這種情況下,Atoi 失敗,因為版本是“”
uj5u.com熱心網友回復:
通常,使用型別開關來檢查介面是否是您預期的任何型別。
func UnmarshalObject(data []byte, object interface{}) error {
err := json.Unmarshal(data, object)
if err {
return error;
}
switch object.(type) {
case string:
// object is a string
case int:
// object is an integer
default:
// object is something you did not expect.
return fmt.Errorf("Unknown type %T", v)
}
return nil;
}
uj5u.com熱心網友回復:
我想通了,并在此程序中學到了一些東西。這個表格有效。
// UnmarshalObject decodes an object from binary data
func UnmarshalObject(data []byte, object interface{}) error {
err := json.Unmarshal(data, object)
if err != nil {
if s, ok := object.(*string); !ok {
return err
}
*s = string(data)
}
return nil
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/385987.html
標籤:去
上一篇:為什么可以將切片分配給空介面,但不能將其強制轉換為相同的空介面
下一篇:洗掉XML中“:”之前的所有字符
