切片golang切片

Fal*_*len 3 go slice

问题是我已经分了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)

是否有可能改进代码?至少,铸造两次以实现这么简单的事情对我来说并不好看.

icz*_*cza 6

如果切片的长度大于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)