Go / Variadic функц

Variadic функц

Та fmt.Println() функцийг ашиглаж байхдаа нэг, хоёр, эсвэл олон аргумент дамжуулж болдог гэдгийг анзаарсан байх. Энэ нь variadic функц юм — дурын тооны аргумент хүлээн авах чадвартай функц.

Go-д та ч мөн ийм функц бичиж чадна.

Variadic функц бичих

Параметрийн төрлийн өмнө ... (гурван цэг) бичнэ:

go
package main

import "fmt"

// int-үүдийг нийлүүлдэг variadic функц
func нийлбэр(тоонууд ...int) int {
    нийт := 0
    for _, т := range тоонууд {
        нийт += т
    }
    return нийт
}

func main() {
    fmt.Println(нийлбэр(1, 2))           // 3
    fmt.Println(нийлбэр(1, 2, 3, 4, 5)) // 15
    fmt.Println(нийлбэр())              // 0 — аргумент дамжуулахгүй байж болно
}

Дэлгэцэнд:

код
3
15
0

тоонууд ...int гэдэг нь "хэдэн ч int аргумент хүлээн авна, тэдгээрийг тоонууд гэсэн нэртэй slice болгоно" гэсэн утгатай. Функцийн дотор тоонууд нь []int slice шиг ажиллана.

Slice-г variadic функцт дамжуулах

Хэрэв танд []int slice байвал ... ашиглан задлаж дамжуулж болно:

go
package main

import "fmt"

func нийлбэр(тоонууд ...int) int {
    нийт := 0
    for _, т := range тоонууд {
        нийт += т
    }
    return нийт
}

func main() {
    тоос := []int{10, 20, 30, 40}

    // slice-г шууд дамжуулах — `...` хэрэгтэй
    fmt.Println(нийлбэр(тоос...))
}

Дэлгэцэнд:

код
100

тоос... гэж бичихэд Go нь slice-н утгуудыг нэг нэгээр нь задалж дамжуулна. Энэ нь маш хэрэгтэй хэрэгсэл.

Variadic ба ердийн параметр хослуулах

Variadic параметр нь функцийн хамгийн сүүлд байх ёстой. Өмнө нь ердийн параметрүүд байж болно:

go
package main

import "fmt"

func мэндчилгээ(угтвар string, нэрс ...string) {
    for _, нэр := range нэрс {
        fmt.Println(угтвар + ", " + нэр + "!")
    }
}

func main() {
    мэндчилгээ("Сайн уу", "Болд", "Анар", "Сэлэнгэ")
    fmt.Println("---")
    мэндчилгээ("Баяртай", "найз")
}

Дэлгэцэнд:

код
Сайн уу, Болд!
Сайн уу, Анар!
Сайн уу, Сэлэнгэ!
---
Баяртай, найз!

Эхний аргумент угтвар нь ердийн string параметр. Дараах бүх аргументууд нэрс variadic параметрт орно.

fmt.Println хэрхэн ажилладаг вэ?

Энэ хичээлийг эхлүүлэхдээ fmt.Println variadic гэж хэлсэн. Одоо та үүнийг ойлгосон байх:

go
package main

import "fmt"

func main() {
    // fmt.Println нь `...any` параметртэй — ямар ч төрлийн
    // ямар ч тооны утгыг хүлээн авч болно
    fmt.Println("нэг")
    fmt.Println("нэг", "хоёр", "гурав")
    fmt.Println(1, 2, 3, "дөрөв", true)
}

Дэлгэцэнд:

код
нэг
нэг хоёр гурав
1 2 3 дөрөв true

any гэдэг нь Go-д ямар ч төрлийг дамжуулж болно гэсэн утгатай. Ингэснээр fmt.Println маш уян хатан ажилладаг.

Дараагийн хичээлд:

Pointer (заагч) буюу санах ойн хаягийг судална. Энэ бол Go-ийн хамгийн чухал ойлголтуудын нэг. Pointer ойлгосноор функцүүд хэрхэн өгөгдлийг шууд өөрчилж чаддаг болохыг ойлгоно.