在阅读kubernetes代码时,有时会看到一些代码对数组与nil进行了比较。

// bindAPIUpdate gets the cached bindings and PVCs to provision in podBindingCache
// and makes the API update for those PVs/PVCs.
func (b *volumeBinder) bindAPIUpdate(podName string, bindings []*bindingInfo, claimsToProvision []*v1.PersistentVolumeClaim) error {
	if bindings == nil {
		return fmt.Errorf("failed to get cached bindings for pod %q", podName)
	}
	if claimsToProvision == nil {
		return fmt.Errorf("failed to get cached claims to provision for pod %q", podName)
	}

有必要明确下数组的初始化方法。

在Golang中,可以采用如下两种方式来声明一个空的数组:

var t []string

或者

t := []string{}

这两种情况初始化的数组的长度均为0,但是t的值并不都为nil。

试一试

可见,只有第一种声明方式,t才为nil。

很好理解不是吗,第二种声明方式,t实际还是指向了一个空数组。这种声明方式,与下面这种方式是类似的。

var a0 []int = make([]int, 0)

试一试

Golang官方建议,当声明空数组时,推荐使用第一种方法;但万事不是绝对的,当在Json编码时,推荐的是后两种方式,因为一个nil空数组会被编码为null,但非nil空数组会被编码为JSON array [],这样方便前端解析。

(a nil slice encodes to null, while []string{} encodes to the JSON array []).

Golang官方不建议接口返回值区分数组是否为nil,可能会引起一些小问题。

Ref: