当前位置: 首页 > 知识库问答 >
问题:

解析并验证“key 1: vale1; key 2: vale2”字符串以有效地Go结构?

杜成和
2023-03-14

我有一个类似于“key1:value1;key2:value2”的字符串(带有key:value模式的字符串,由连接)。

现在我想将这个字符串解析为Go结构:

type CustomStruct struct {
   KeyName1 string `name:"key1" somevalidation:"xxx"`
   KeyName2 int    `name:"key2" somevalidation:"yyy"`
}

在上面的示例中,struct标记定义了字符串中键的名称,并可以为其相应的值提供一些验证(如果验证失败,它可以设置默认值)。例如,KeyName2是一个int值,所以我希望 可以检查 是否满足,比如,大于30且小于100。

在另一个场景中,我可以为字符串定义另一个结构<code>CustomStruct2</code>,如<code>key3:value3;键4:值4

我如何才能高效、优雅地存档这种需求?

共有1个答案

羊舌承
2023-03-14

我假设您可以将数据解析到map[string]接口{}。

使用反射包来设置字段。下面是基本功能:

// set sets fields in struct pointed to by pv to values in data.
func set(pv interface{}, data map[string]interface{}) {
    // pv is assumed to be pointer to a struct
    s := reflect.ValueOf(pv).Elem()

    // Loop through fields
    t := s.Type()
    for i := 0; i < t.NumField(); i++ {

        // Set field if there's a data value for the field.
        f := t.Field(i)
        if d, ok := data[f.Tag.Get("name")]; ok {
            s.Field(i).Set(reflect.ValueOf(d))
        }
    }
}

此代码假定数据映射中的值可分配给结构中的相应字段,并且第一个参数是指向结构的指针。如果这些假设不成立,代码将会死机。您可以通过使用反射包检查类型和可分配性来防止这种情况。

游乐场示例

 类似资料:
  • 问题内容: 在Go中,a 是原始类型,这意味着它是只读的,对其的每次操作都会创建一个新的字符串。 因此,如果我想多次连接字符串而又不知道结果字符串的长度,那么最好的方法是什么? 天真的方法是: 但这似乎不是很有效。 问题答案: 新方法: 在Go 1.10+中strings.Builder,这里是。 生成器用于使用Write方法有效地构建字符串。它最大程度地减少了内存复制。零值可以使用了。 与几乎相

  • 我试图合并两个数据帧,条件是key1包含key2,下面是一个示例 我在key'name'列上进行合并,我想要得到的结果是 在我的例子中,df1相对较小,大约有600条记录,但df2相当大,大约有200万条记录,所以效率也是一个问题,非常感谢。

  • 问题内容: 我有一个字符串,其内容是XML。我想将标签分开,并使其成为Java中的字符串列表。以下是我正在尝试的东西: 我想将其分为以下列表: 我试图通过JAXB处理器执行此操作,但效果不佳。还使用split尝试了一些愚蠢的逻辑,但这也无济于事。还有其他方法可以做到这一点吗? 问题答案:

  • 我的Java应用程序“A”正在从另一个Java应用程序获取移动电话号码作为字符串。因此,在应用程序A获得手机号码字符串后,我需要验证该手机号码字符串中是否只有数字。为了验证我使用了如下的简单逻辑, 我正在检查I=1,因为国家代码的第一个字符将是“”。这种方法是O(n)。还有另一种方法,我们可以使用。这将抛出<代码> No.MultFrimeExtry,以便我们可以捕获并考虑它是一个字母数字字符串。

  • Milo Yip 2016/9/27 本文是《从零开始的 JSON 库教程》的第三个单元解答编。解答代码位于 json-tutorial/tutorial03_answer。 1. 访问的单元测试 在编写单元测试时,我们故意先把值设为字符串,那么做可以测试设置其他类型时,有没有调用 lept_free() 去释放内存。 static void test_access_boolean() {

  • @target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})@retention(value=runtime)@documented@constraint(validatedby={})public@interface Min 带注释的元素必须是一个数值,该数值必须大于或等于指定的最小值。 支持的类型有: 注意,由于舍入错误