I would like to build a function that returns a slice of any size. I know I can do
func BuildSlice() [100]int { return [100]int{} }
but I would like to be able to return slices of different sizes from the same function. Something like:
func BuildSlice(int size) [...]int { return [size]int{} }
I've tried the above as well as
func BuildSlice(size int) []int { return [size]int{} }
Please point me in the right direction.
Thanks.
First of all, slices are already of "variable size": [100]int
and [...]int
are array type definitions.
[]int
is the correct syntax for a slice, and you could implement the function as:
func BuildSlice(size int) []int {
return make([]int, size)
}
This will return a slice of zero values with the desired size, similar to what your array version does.
The Go Programming Language Specification
Making slices, maps and channels
The built-in function make takes a type T, which must be a slice, map or channel type, optionally followed by a type-specific list of expressions. It returns a value of type T (not *T). The memory is initialized as described in the section on initial values.
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
The size arguments n and m must be of integer type or untyped. A constant size argument must be non-negative and representable by a value of type int. If both n and m are provided and are constant, then n must be no larger than m. If n is negative or larger than m at run time, a run-time panic occurs.
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)
For example,
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))
}
Output:
7 42
100 100