问题是我已经分了bar.我想用bar的前两个元素创建另一个slice foo; 如果bar中至少有一个元素,那么如果bar中至少有2个元素或者bar的第一个元素.
我的想法:
// bar := []int{1, 2, 3...
foo := bar[:(int)(math.Min(float64(len(bar)), 2))]
Run Code Online (Sandbox Code Playgroud)
编辑: 这是我尝试的另一种方式,
x := 2
if len(bar) < 2 {
x = len(bar)
}
foo := bar[:x]
Run Code Online (Sandbox Code Playgroud)
是否有可能改进代码?至少,铸造两次以实现这么简单的事情对我来说并不好看.
如果切片的长度大于2,则可以重新切片.如果没有,则无需重新分配,只需在分配中使用切片本身即可自动满足您的需求:结果最多可包含2个元素.
你甚至可以"备用"以下的else分支if:
foo := bar
if len(foo) > 2 {
foo = foo[:2]
}
Run Code Online (Sandbox Code Playgroud)
注意:
切片是参考类型.因此,即使您曾经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]
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上试试):
[0 1]
[0 1 2 3]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1509 次 |
| 最近记录: |