登录
首页 >  Golang >  Go问答

在分配时解包切片?

来源:Golang技术栈

时间:2023-04-13 11:56:04 402浏览 收藏

本篇文章向大家介绍《在分配时解包切片?》,主要包括golang,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

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

但这是无效的。

正确答案

正如 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

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

今天关于《在分配时解包切片?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表