函数make
的描述如下:
func make(Type, size IntegerType) Type
当我们使用make
进行切片时,有时显示如下:
make([]int, 0, 10)
所以我的问题是:
make
函数如何获取三个参数? size IntegerType
不是Vararg。我很困惑......
答案 0 :(得分:5)
make
函数是一组内置函数之一,允许你在Go代码中做一些你无法实现的事情(至少不是干净利落和轻松)。
它有许多重载形式,用于创建地图,通道和切片(请参阅
https://golang.org/ref/spec#Making_slices_maps_and_channels):
您的混淆可能源于https://golang.org/pkg/builtin/#make,其中make
显示签名为func make(Type, size IntegerType) Type
。
如果您仔细查看该部分,您还会看到make
可以有第三个参数的指示:
切片:大小指定长度。切片的容量是 等于它的长度。 可以提供第二个整数参数 指定不同的容量;它必须不小于长度, 所以make([] int,0,10)分配一个长度为0且容量为10的切片。
您还可以注意到make
也可以在没有整数参数的情况下使用:
地图:初始分配是根据大小而不是 结果图的长度为0. 可以省略大小,在这种情况下为a 分配小的起始大小。
频道:使用指定的缓冲区容量初始化频道的缓冲区。如果为零,或省略大小,则通道为无缓冲。
答案 1 :(得分:2)
make()
函数不是常规函数,是内置函数,是语言规范的一部分。您在builtin
包(builtin.make()
)中看到的内容仅用于文档目的。这不是函数的实际签名。第三个可选参数是容量,只有在您创建切片时才能提供。
规范中描述了Making slices, maps and channels:
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
提及
使用内置函数
T
创建给定元素类型make
的新的初始化切片值,该函数采用切片类型和指定长度的参数以及可选的容量即可。使用make创建的切片始终会分配返回切片值所引用的新隐藏数组。也就是说,执行make([]T, length, capacity)
产生与分配数组和切片相同的切片,因此这两个表达式是等价的:
make([]int, 50, 100) new([100]int)[0:50]
答案 2 :(得分:0)
功能make
is a builtin function。该功能具有其他功能无法使用的功能。一个是你注意到它需要一个可变数字参数。另一个是第一个参数是一个类型。
function definition func make(Type, size IntegerType) Type
仅供参考。它不是函数的实际定义。