【问题标题】:How can I define variadic fields on a struct? Go如何在结构上定义可变参数字段?走
【发布时间】:2015-01-21 18:22:04
【问题描述】:

除了自定义字段之外,我还需要一个接受名称/值对的数据结构。如何定义这样的结构?

例如

type mybasket struct {
    Coupons string
    Amount int
    ....... // string or int
}

【问题讨论】:

  • 请查看 Go 常见问题解答:在那里讨论了联合和变体类型。
  • 另外,map[string]interface{} 是另一种通用的“东西袋”类型。您需要地图查找和type assertion 来解压缩内容。如果你能弄清楚如何避免在这里做一些动态的事情,那可能是一件好事,因为提前声明字段和类型通常会在编译期间捕获更多错误(更容易调试),并且可以让你的代码运行得更快。
  • 这个问题很不清楚。 “接受”名称/值对是什么意思?还是“自定义”字段? “字符串或整数”是否意味着您要求的数据类型代表字符串或整数?您能更具体地说明您要完成的工作吗?
  • @AmitKumarGupta 没错。除了优惠券和金额之外,结构应该“接受”整数或字符串的值。请注意,字段的数量应该是可变的/无限的。

标签: types go


【解决方案1】:

我建议在类型上定义 settergetter 方法,并将值存储在结构的切片中。

例如:

package main

import "fmt"

type kv struct {
    k, v string
}

type mybasket struct {
    Coupons  string
    Amount   int
    Contents []kv
}

func (t *mybasket) SetContents(c ...kv) {
    t.Contents = c
    return
}

func (t *mybasket) GetContents() []kv {
    return t.Contents
}

func main() {
    T := &mybasket{"couponlist", 100, []kv{}} // New Basket
    kvs := []kv{{"foo", "bar"}, {"baz", "bat"}} // Contents
    T.SetContents(kvs...) // Set Contents
    fmt.Printf("%v", T.GetContents()) // Get Contents
}

打印:

[{foo bar} {baz bat}]

Playground

【讨论】:

    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2019-01-03
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多