如何转换结构字段名称中的任何字符串,例如

时间:2019-04-01 00:39:29

标签: go struct reflect

我想知道是否存在一种原生方式来转换字符串,例如:

  • button
  • document
  • a.string
  • a-string

在Go中遵循遵循struct的公共字段成员约定的字符串。

想法是编写一个接受字符串的函数,并尝试获取字段的值,即使所传递的字符串未使用PascalCase约定,例如:

a_string

我使用的是strcase包,但仅适用于ASCII。

2 个答案:

答案 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