小编典典

在分配作业时解压切片?

go

在Go中,有没有一种优雅的方法可以像在Python中那样从数组进行多个分配?这是我要尝试执行的Python示例(拆分一个字符串,然后将结果数组分配给两个变量)。

python:
>>> a, b = "foo;bar".split(";")

我当前的解决方案是:

x := strings.Split("foo;bar", ";")
a, b := x[0], x[1]

在某些结构中,我可以看到它变得凌乱。我当前面对的实际示例是一个书签文件,它解析并分配给地图:

bookmark := make(map[string]string)
x := strings.Split("foo\thttps://bar", "\t")
name, link := x[0], x[1]
bookmark[name] = link

现在我有一个无用的变量x。我想做类似的事情:

bookmark := make(map[string]string)
name, line := strings.Split("foo\thttps://bar", "\t")
bookmark[name] = link

但这是无效的。


阅读 230

收藏
2020-07-02

共1个答案

小编典典

正如Sergio Tulentsev所提到的,不支持Python中的常规打包/解包。我认为方法是使用多个返回值定义自己的小型即席函数:

func splitLink(s, sep string) (string, string) {
    x := strings.Split(s, sep)
    return x[0], x[1]
}

然后您可以编写:

name, link := splitLink("foo\thttps://bar", "\t")

但这显然仅在分割至少两个子字符串时有效,并且如果两个以上的子字符串被分割,则默默地忽略。如果这是您经常使用的东西,则可能会使您的代码更具可读性。

- 编辑 -

解数组的另一种方法是通过可变参数指针参数:

func unpack(s []string, vars... *string) {
    for i, str := range s {
        *vars[i] = str
    }
}

哪个让你写:

var name, link string
unpack(strings.Split("foo\thttps://bar", "\t"), &name, &link)
bookmarks[name] = link

这将适用于任何数组大小,但可以说可读性较差,并且必须显式声明变量。

2020-07-02