Không có cách nào ngắn gọn hơn, những gì bạn đã làm là cách "đúng"; bởi vì các lát cắt luôn là một chiều nhưng có thể được cấu tạo để xây dựng các đối tượng có chiều cao hơn. Xem câu hỏi này để biết thêm chi tiết: Đi: Cách biểu diễn bộ nhớ của mảng hai chiều .
Một điều bạn có thể đơn giản hóa nó là sử dụng for range
cấu trúc:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
Cũng lưu ý rằng nếu bạn khởi tạo lát cắt của mình bằng một ký tự tổng hợp , bạn sẽ nhận được điều này "miễn phí", ví dụ:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]]
Vâng, điều này có giới hạn của nó là dường như bạn phải liệt kê tất cả các yếu tố; nhưng có một số thủ thuật, cụ thể là bạn không phải liệt kê tất cả các giá trị, chỉ những giá trị không phải là giá trị 0 của kiểu phần tử của lát cắt. Để biết thêm chi tiết về điều này, hãy xem Các mục được khóa trong khởi tạo mảng golang .
Ví dụ: nếu bạn muốn một lát cắt trong đó 10 phần tử đầu tiên là số không, sau đó theo sau 1
và 2
, nó có thể được tạo như thế này:
b := []uint{10: 1, 2}
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2]
Cũng lưu ý rằng nếu bạn sử dụng mảng thay vì các lát , nó có thể được tạo rất dễ dàng:
c := [5][5]uint8{}
fmt.Println(c)
Đầu ra là:
[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
Trong trường hợp mảng, bạn không phải lặp lại mảng "bên ngoài" và khởi tạo mảng "bên trong", vì mảng không phải là bộ mô tả mà là giá trị. Xem bài đăng trên blog Mảng, lát (và chuỗi): Cơ chế 'nối thêm' để biết thêm chi tiết.
Hãy thử các ví dụ trên Go Playground .
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
khi tôi cố gắng gán mảng cho những gì tôi đoán tôi đang nói với Go là một lát cắt.