定义一个在golang中返回可变大小片段的函数

时间:2014-03-11 05:42:03

标签: arrays function go

我想构建一个返回任意大小切片的函数。我知道我可以做到

func BuildSlice() [100]int { return [100]int{} }

但我希望能够从同一个函数返回不同大小的切片。类似的东西:

func BuildSlice(int size) [...]int { return [size]int{} }

我已尝试过上述以及

func BuildSlice(size int) []int { return [size]int{} }

请指出正确的方向。

感谢。

2 个答案:

答案 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