在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。我想做类似的事情:
x
bookmark := make(map[string]string) name, line := strings.Split("foo\thttps://bar", "\t") bookmark[name] = link
但这是无效的。
正如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
这将适用于任何数组大小,但可以说可读性较差,并且必须显式声明变量。