问题描述:,我有一个片bar。如果在foo中至少有2个元素,我想要创建另一个带有bar前两个元素的片bar。或者使用bar的第一个元素,如果bar至少有一个元素。
我的想法是:
// bar := []int{1, 2, 3...
foo := bar[:(int)(math.Min(float64(len(bar)), 2))]编辑:,这是我尝试的另一种方式,
x := 2
if len(bar) < 2 {
x = len(bar)
}
foo := bar[:x]有可能改进代码吗?至少在我看来,为了实现这么简单的事情而选两次并不是件好事。
发布于 2015-04-08 06:22:49
如果您的片的长度大于2,您可以重新分配它。如果不需要,不需要重新分配,只需使用片本身的赋值,这将自动满足您的需要:结果最多有2个元素。
您甚至可以“备用”else分支的if。
foo := bar
if len(foo) > 2 {
foo = foo[:2]
}注:
切片是引用类型。因此,即使使用bar初始化foo,如果事后修改foo变量(而不是切片的元素),这不会影响bar (赋值时复制引用值):
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]输出(在围棋游乐场上尝试):
[0 1]
[0 1 2 3]发布于 2015-04-07 13:14:59
只需使用if即可。由于int和float64之间没有转换,所以它的可读性和性能要好得多。
var foo []int
if len(bar) > 1 {
foo = bar[:2]
} else {
foo = bar[:len(bar)]
}发布于 2015-04-07 13:23:04
Go没有math.MinInt。但是,实现一个目标很简单,就像:
func Min(x, y int) int {
if x < y {
return x
}
return y
}
...
foo := bar[:Min(len(bar), 2)]https://stackoverflow.com/questions/29492505
复制相似问题