情况一
package main
import "fmt"

func main() {
	mat := [][]int{{}}
	fmt.Println(len(mat), ", ", cap(mat))  //1, 1
	fmt.Println(len(mat[0]), ", ", cap(mat[0]))  //0, 0
	fmt.Println(mat)  //[[]]

	mat = append(mat, []int{1, 2})
	fmt.Println(len(mat), ", ", cap(mat))  //2, 2
	fmt.Println(len(mat[0]), ", ", cap(mat[0]))  //0, 0
	fmt.Println(mat)  //[[], [1, 2]]	
}

上述方法创建的二维切片,会在多出一个容量为0的一维切片;
不推荐使用该方法;

情况二
//直接初始化
package main
import "fmt"

func main() {
	mat := [][]int{{1, 2}, {3, 4}, {5, 6}}
	fmt.Println(len(mat), ", ", cap(mat))  //3, 3
	fmt.Println(len(mat[0]), ", ", cap(mat[0]))  //2, 2
	fmt.Println(mat)  //[[1, 2], [3, 4], [5, 6]]
}
情况三(推荐使用)
package main
import "fmt"

func main() {
	var mat [][]int
	for i := 0; i < 5; i++ {
		nums := make([]int, 4)
		mat = append(mat, nums)
	}
	fmt.Println(len(mat), ", ", cap(mat))  //5, 8
	fmt.Println(len(mat[0]), ", ", cap(mat[0]))  //4, 4
	fmt.Println(mat)  
//[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
}