首页
学习
活动
专区
圈层
工具
发布

切片
EN

Stack Overflow用户
提问于 2015-04-07 13:12:13
回答 5查看 7.2K关注 0票数 4

问题描述:,我有一个片bar。如果在foo中至少有2个元素,我想要创建另一个带有bar前两个元素的片bar。或者使用bar的第一个元素,如果bar至少有一个元素。

我的想法是:

代码语言:javascript
复制
// bar := []int{1, 2, 3...
foo := bar[:(int)(math.Min(float64(len(bar)), 2))]

编辑:,这是我尝试的另一种方式,

代码语言:javascript
复制
x := 2
if len(bar) < 2 {
    x = len(bar)
}
foo := bar[:x]

有可能改进代码吗?至少在我看来,为了实现这么简单的事情而选两次并不是件好事。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-04-08 06:22:49

如果您的片的长度大于2,您可以重新分配它。如果不需要,不需要重新分配,只需使用片本身的赋值,这将自动满足您的需要:结果最多有2个元素。

您甚至可以“备用”else分支的if

代码语言:javascript
复制
foo := bar
if len(foo) > 2 {
    foo = foo[:2]
}

注:

切片是引用类型。因此,即使使用bar初始化foo,如果事后修改foo变量(而不是切片的元素),这不会影响bar (赋值时复制引用值):

代码语言:javascript
复制
bar := []int{0, 1, 2, 3}
foo := bar
if len(foo) > 2 {
    foo = foo[:2]
}
fmt.Println(foo) // Here foo is [0, 1] as expected

foo = foo[:1]    // Reslicing foo
fmt.Println(bar) // Bar is unaffected, bar = [0 1 2 3]

输出(在围棋游乐场上尝试):

代码语言:javascript
复制
[0 1]
[0 1 2 3]
票数 7
EN

Stack Overflow用户

发布于 2015-04-07 13:14:59

只需使用if即可。由于intfloat64之间没有转换,所以它的可读性和性能要好得多。

代码语言:javascript
复制
var foo []int
if len(bar) > 1 {
    foo = bar[:2]
} else {
    foo = bar[:len(bar)]
}
票数 3
EN

Stack Overflow用户

发布于 2015-04-07 13:23:04

Go没有math.MinInt。但是,实现一个目标很简单,就像:

代码语言:javascript
复制
func Min(x, y int) int {
    if x < y {
        return x
    }
    return y
}

...

foo := bar[:Min(len(bar), 2)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29492505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档