Defining a function that returns a slice of variable size in golang

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.

Answers


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

Need Your Help

Ruby on Rails 4 and cocoon gem : How to interrupt deletion on cocoon:before-remove

ruby-on-rails ruby coffeescript cocoon-gem

I'm looking for a way to do a more sophisticated confirm that the one I use right now that look like this :