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

Dan*_*ill 14 arrays function go

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

func BuildSlice() [100]int { return [100]int{} }
Run Code Online (Sandbox Code Playgroud)

但我希望能够从同一个函数返回不同大小的切片.就像是:

func BuildSlice(int size) [...]int { return [size]int{} }
Run Code Online (Sandbox Code Playgroud)

我已经尝试过上述以及

func BuildSlice(size int) []int { return [size]int{} }
Run Code Online (Sandbox Code Playgroud)

请指出我正确的方向.

谢谢.

Jam*_*dge 26

首先,切片已经是"可变大小":[100]int并且[...]int是数组类型定义.

[]int 是切片的正确语法,您可以将函数实现为:

func BuildSlice(size int) []int {
    return make([]int, size)
}
Run Code Online (Sandbox Code Playgroud)

这将返回一个具有所需大小的零值,类似于您的阵列版本.


pet*_*rSO 5

Go 编程语言规范

制作切片、地图和通道

内置函数 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
Run Code Online (Sandbox Code Playgroud)

大小参数 n 和 m 必须是整数类型或无类型。常量大小参数必须是非负的并且可由 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)
Run Code Online (Sandbox Code Playgroud)

例如,

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))
}
Run Code Online (Sandbox Code Playgroud)

输出:

7 42
100 100
Run Code Online (Sandbox Code Playgroud)