我想知道是否存在一种原生方式来转换字符串,例如:
button
document
a.string
a-string
在Go中遵循遵循struct的公共字段成员约定的字符串。
想法是编写一个接受字符串的函数,并尝试获取字段的值,即使所传递的字符串未使用PascalCase约定,例如:
a_string
我使用的是strcase包,但仅适用于ASCII。
答案 0 :(得分:3)
借助正则表达式的魔力
https://goplay.space/#xHfxG249CsH
generated_password = ''.join(random.choice(letters) for _ in range(length))
输出
package main
import (
"fmt"
"regexp"
"strings"
)
func ConvertFieldName(s string) string {
r := regexp.MustCompile("(\\b|-|_|\\.)[a-z]")
return r.ReplaceAllStringFunc(s, func(t string) string {
if len(t) == 1 {
return strings.ToUpper(t)
} else {
return strings.ToUpper(string(t[1]))
}
})
}
func main() {
fmt.Println(ConvertFieldName("debug"))
fmt.Println(ConvertFieldName("a.string"))
fmt.Println(ConvertFieldName("a-string"))
fmt.Println(ConvertFieldName("a_string"))
fmt.Println(ConvertFieldName("-a.string"))
fmt.Println(ConvertFieldName("something-more-complex"))
}
答案 1 :(得分:1)
package main
import (
"fmt"
"reflect"
)
type MyStruct struct {
Debug bool
AString bool
}
var myStruct MyStruct
func GetField(s string) (reflect.Value, error) {
t := reflect.TypeOf(myStruct)
v := reflect.ValueOf(myStruct)
for fieldIndex := 0; fieldIndex < v.NumField(); fieldIndex++ {
if t.Field(fieldIndex).Name == s {
return v.Field(fieldIndex), nil
}
}
return reflect.Value{}, fmt.Errorf("%s not exist", s)
}
func main() {
var v reflect.Value
var err error
v, err = GetField("Debug")
fmt.Println(v, err)
v, err = GetField("debug")
fmt.Println(v, err)
}
相反,您可以尝试定义自己的字段标记,例如json tag