Go / Slice үндэс

Slice үндэс

Slice бол Go-ийн хамгийн их хэрэглэгддэг өгөгдлийн бүтэц юм. Массивтай адил нэг төрлийн утгуудыг дарааллан хадгалдаг ч хамгийн том ялгаа нь: slice-ийн хэмжээ өөрчлөгдөж болно.

Та бодит программ бичихдээ массиваас илүү slice ашиглах болно.

Slice үүсгэх

go
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-д шинэ элемент нэмнэ:

go
package main

import "fmt"

func main() {
    дуунууд := []string{"Монгол", "Нутаг"}

    // Нэг элемент нэмэх
    дуунууд = append(дуунууд, "Миний")
    fmt.Println(дуунууд) // [Монгол Нутаг Миний]

    // Хэд хэдэн элемент нэгэн зэрэг нэмэх
    дуунууд = append(дуунууд, "Сайхан", "Нутаг")
    fmt.Println(дуунууд) // [Монгол Нутаг Миний Сайхан Нутаг]

    fmt.Println("Урт:", len(дуунууд)) // 5
}

Дэлгэцэнд:

код
[Монгол Нутаг Миний]
[Монгол Нутаг Миний Сайхан Нутаг]
Урт: 5

дуунууд = append(дуунууд, "Миний")append нь шинэ slice буцааж өгнө, тиймээс дуунууд = гэж дахин оноож байна. Энэ нь Go-д заавал байдаг дүрэм.

Slice хэсэглэх

Slice-г [эхлэл:төгсгөл] аргаар хэсэглэж болно:

go
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 ашиглан давтана:

go
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-г нэгтгэж болно:

go
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 тухай дэлгэрэнгүй судална.