gpt4 book ai didi

string - 如何使用json字符串值获取iota值?

转载 作者:IT王子 更新时间:2023-10-29 02:30:59 25 4
gpt4 key购买 nike

我有一个 constutil 包,我在其中使用 iota 定义了一些常量值。

package constutil

type UserType uint

const (
Free UserType = iota + 1
Premium UserType
...
)

json 我会得到 {"user": "Premium", ...}。现在我需要保存用户的值,例如 Premium,它是 2。我试图获得这样的值(value):

constutil.(req.User)

但它不起作用,因为 req.User 返回一个 string,例如:"Premium"

我可以使用 map[string]uint 来完成。但是有什么方法可以使用 iota 来实现吗?

最佳答案

不要认为在 iota 值和字符串之间有任何内置的映射方式。有一些工具可以生成执行映射的代码。

我遇到过类似的情况,当我不想依赖生成器或其他工具时,我做过类似的事情。希望它能作为一些事情的开始。

https://play.golang.org/p/MxPL-0FVGMt

package main

import (
"encoding/json"
"fmt"
)

type UserType uint

const (
UserTypeFree UserType = iota
UserTypePremium
)

var UserTypeToString = map[UserType]string{
UserTypeFree: "Free",
UserTypePremium: "Premium",
}

var UserTypeFromString = map[string]UserType{
"Free": UserTypeFree,
"Premium": UserTypePremium,
}

func (ut UserType) String() string {
if s, ok := UserTypeToString[ut]; ok {
return s
}
return "unknown"
}

func (ut UserType) MarshalJSON() ([]byte, error) {
if s, ok := UserTypeToString[ut]; ok {
return json.Marshal(s)
}
return nil, fmt.Errorf("unknown user type %d", ut)
}

func (ut *UserType) UnmarshalJSON(text []byte) error {
var s string
if err := json.Unmarshal(text, &s); err != nil {
return err
}
var v UserType
var ok bool
if v, ok = UserTypeFromString[s]; !ok {
return fmt.Errorf("unknown user type %s", s)
}
*ut = v
return nil
}

func main() {
var ut UserType

json.Unmarshal([]byte(`"Free"`), &ut)

fmt.Printf("%#v %v \n", ut, ut)

b, _ := json.Marshal(ut)

fmt.Printf("%v\n", string(b))

}

关于string - 如何使用json字符串值获取iota值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54735113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com