我想构建一个返回任意大小切片的函数。我知道我可以做到
func BuildSlice() [100]int { return [100]int{} }
但我希望能够从同一个函数返回不同大小的切片。类似的东西:
func BuildSlice(int size) [...]int { return [size]int{} }
我已尝试过上述以及
func BuildSlice(size int) []int { return [size]int{} }
请指出正确的方向。
感谢。
答案 0 :(得分:23)
首先,切片已经是“可变大小”:[100]int
和[...]int
是数组类型定义。
[]int
是切片的正确语法,您可以将该函数实现为:
func BuildSlice(size int) []int {
return make([]int, size)
}
这将返回一个具有所需大小的零值,类似于您的阵列版本。
答案 1 :(得分:2)
The Go Programming Language Specification
Making slices, maps and channels
内置函数make采用类型T,它必须是切片,地图 或通道类型,可选地后跟特定类型的列表 表达式。它返回类型T的值(不是* T)。记忆是 如初始值一节中所述初始化。
Call Type T Result
make(T, n) slice slice of type T with length n and capacity n make(T, n, m) slice slice of type T with length n and capacity m
大小参数n和m必须是整数类型或无类型。一个 常量大小参数必须是非负的并且可由a表示 int类型的值。如果n和m都被提供并且是常数,那么 n必须不大于m。如果n在运行时为负或大于m 时间,发生运行时恐慌。
s := make([]int, 10, 100) // slice with len(s) == 10, cap(s) == 100 s := make([]int, 1e3) // slice with len(s) == cap(s) == 1000 s := make([]int, 1<<63) // illegal: len(s) is not representable by a value of type int s := make([]int, 10, 0) // illegal: len(s) > cap(s)
例如,
package main
import "fmt"
func main() {
s := make([]int, 7, 42)
fmt.Println(len(s), cap(s))
t := make([]int, 100)
fmt.Println(len(t), cap(t))
}
输出:
7 42
100 100