ไม่มีวิธีที่กระชับกว่านี้สิ่งที่คุณทำคือวิธีที่ "ถูกต้อง" เนื่องจากชิ้นส่วนเป็นมิติเดียวเสมอ แต่อาจประกอบขึ้นเพื่อสร้างวัตถุที่มีมิติสูงขึ้น ดูคำถามนี้สำหรับรายละเอียดเพิ่มเติม: ไป: การแสดงหน่วยความจำของอาร์เรย์สองมิติเป็นอย่างไร
สิ่งหนึ่งที่คุณสามารถทำให้มันง่ายขึ้นคือการใช้for range
โครงสร้าง:
a := make([][]uint8, dy)
for i := range a {
a[i] = make([]uint8, dx)
}
โปรดทราบว่าหากคุณเริ่มต้นสไลซ์ด้วยลิเทอรัลแบบผสมคุณจะได้รับสิ่งนี้ "ฟรี" ตัวอย่างเช่น:
a := [][]uint8{
{0, 1, 2, 3},
{4, 5, 6, 7},
}
fmt.Println(a)
ใช่สิ่งนี้มีข้อ จำกัด เนื่องจากดูเหมือนว่าคุณต้องแจกแจงองค์ประกอบทั้งหมด แต่มีเทคนิคบางอย่างกล่าวคือคุณไม่จำเป็นต้องแจกแจงค่าทั้งหมดเฉพาะค่าที่ไม่ใช่ค่าศูนย์ของประเภทองค์ประกอบของชิ้นส่วน สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ดูรายการคีย์ในการเริ่มต้นอาร์เรย์ golang
ตัวอย่างเช่นหากคุณต้องการชิ้นส่วนที่ 10 องค์ประกอบแรกเป็นศูนย์จากนั้นจึงตามด้วย1
และ2
สามารถสร้างได้ดังนี้:
b := []uint{10: 1, 2}
fmt.Println(b)
นอกจากนี้โปรดทราบว่าหากคุณใช้อาร์เรย์แทนชิ้นสามารถสร้างได้ง่ายมาก:
c := [5][5]uint8{}
fmt.Println(c)
ผลลัพธ์คือ:
[[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]]
ในกรณีของอาร์เรย์คุณไม่จำเป็นต้องวนซ้ำบนอาร์เรย์ "ด้านนอก" และเริ่มต้นอาร์เรย์ "ภายใน" เนื่องจากอาร์เรย์ไม่ใช่ตัวบ่งชี้ แต่เป็นค่า ดูบล็อกโพสต์อาร์เรย์ชิ้นส่วน (และสตริง): กลไกของ "ผนวก"สำหรับรายละเอียดเพิ่มเติม
ลองตัวอย่างบนไปสนามเด็กเล่น
cannot use [5][2]string literal (type [5][2]string) as type [][]string in field value
เมื่อฉันพยายามกำหนดอาร์เรย์ให้กับสิ่งที่ฉันเดาว่าฉันกำลังบอกว่า Go เป็นสไลซ์