Slice үндэс
Slice бол Go-ийн хамгийн их хэрэглэгддэг өгөгдлийн бүтэц юм. Массивтай адил нэг төрлийн утгуудыг дарааллан хадгалдаг ч хамгийн том ялгаа нь: slice-ийн хэмжээ өөрчлөгдөж болно.
Та бодит программ бичихдээ массиваас илүү slice ашиглах болно.
Slice үүсгэх
package main
import "fmt"
func main() {
// Шууд slice үүсгэх — хэмжээ заахгүй
жимснүүд := []string{"алим", "лийр", "тавиун"}
fmt.Println(жимснүүд) // [алим лийр тавиун]
fmt.Println(len(жимснүүд)) // 3
// Хоосон slice
тоонууд := []int{}
fmt.Println(len(тоонууд)) // 0
// make ашиглан үүсгэх
оноонууд := make([]int, 5) // 5 элементтэй, бүгд 0
fmt.Println(оноонууд) // [0 0 0 0 0]
}
Дэлгэцэнд:
[алим лийр тавиун]
3
0
[0 0 0 0 0]
[]string гэдэг нь "string-үүдийн slice" гэсэн утгатай. Массиваас ялгагдах нь [3] биш [] байдаг — хэмжээ заагаагүй.
append — элемент нэмэх
append функцээр slice-д шинэ элемент нэмнэ:
package main
import "fmt"
func main() {
дуунууд := []string{"Монгол", "Нутаг"}
// Нэг элемент нэмэх
дуунууд = append(дуунууд, "Миний")
fmt.Println(дуунууд) // [Монгол Нутаг Миний]
// Хэд хэдэн элемент нэгэн зэрэг нэмэх
дуунууд = append(дуунууд, "Сайхан", "Нутаг")
fmt.Println(дуунууд) // [Монгол Нутаг Миний Сайхан Нутаг]
fmt.Println("Урт:", len(дуунууд)) // 5
}
Дэлгэцэнд:
[Монгол Нутаг Миний]
[Монгол Нутаг Миний Сайхан Нутаг]
Урт: 5
дуунууд = append(дуунууд, "Миний") — append нь шинэ slice буцааж өгнө, тиймээс дуунууд = гэж дахин оноож байна. Энэ нь Go-д заавал байдаг дүрэм.
Slice хэсэглэх
Slice-г [эхлэл:төгсгөл] аргаар хэсэглэж болно:
package main
import "fmt"
func main() {
тоонууд := []int{10, 20, 30, 40, 50, 60}
fmt.Println(тоонууд[1:4]) // [20 30 40] — 1-ээс 3 хүртэл (4 ороогүй)
fmt.Println(тоонууд[:3]) // [10 20 30] — эхнээс 2 хүртэл
fmt.Println(тоонууд[3:]) // [40 50 60] — 3-аас сүүл хүртэл
fmt.Println(тоонууд[:]) // [10 20 30 40 50 60] — бүгд
}
Дэлгэцэнд:
[20 30 40]
[10 20 30]
[40 50 60]
[10 20 30 40 50 60]
[1:4] гэдэг нь "1 дүгээр index-ээс 4 дүгээр index-ийн өмнө хүртэл" гэсэн утгатай. Математикийн [1, 4) интервалтай адил.
Slice дээр давтах
Массивтай адилаар range ашиглан давтана:
package main
import "fmt"
func main() {
сурагчид := []string{"Болд", "Анар", "Бат", "Оюун"}
fmt.Println("Сурагчдын жагсаалт:")
for i, нэр := range сурагчид {
fmt.Printf("%d. %s\n", i+1, нэр)
}
// Зөвхөн утга хэрэгтэй бол index-г _ ашиглан орхино
нийт := 0
оноонууд := []int{88, 92, 76, 95}
for _, оноо := range оноонууд {
нийт += оноо
}
fmt.Println("Нийт оноо:", нийт)
}
Дэлгэцэнд:
Сурагчдын жагсаалт:
1. Болд
2. Анар
3. Бат
4. Оюун
Нийт оноо: 351
Хоёр slice нэгтгэх
append болон ... ашиглан хоёр slice-г нэгтгэж болно:
package main
import "fmt"
func main() {
эхний := []int{1, 2, 3}
хоёрдугаар := []int{4, 5, 6}
нэгтгэсэн := append(эхний, хоёрдугаар...)
fmt.Println(нэгтгэсэн) // [1 2 3 4 5 6]
}
Дэлгэцэнд:
[1 2 3 4 5 6]
хоёрдугаар... нь "slice-н бүх элементийг задал" гэсэн үг. Энэ нь variadic функцт slice дамжуулахтай адил зарчим юм.
Дараагийн хичээлд:
Slice-тай ажиллах дэвшилтэт үйлдлүүд — элемент устгах, slice хуулах, болон capacity тухай дэлгэрэнгүй судална.