Variadic функц
Та fmt.Println() функцийг ашиглаж байхдаа нэг, хоёр, эсвэл олон аргумент дамжуулж болдог гэдгийг анзаарсан байх. Энэ нь variadic функц юм — дурын тооны аргумент хүлээн авах чадвартай функц.
Go-д та ч мөн ийм функц бичиж чадна.
Variadic функц бичих
Параметрийн төрлийн өмнө ... (гурван цэг) бичнэ:
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 байвал ... ашиглан задлаж дамжуулж болно:
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 параметр нь функцийн хамгийн сүүлд байх ёстой. Өмнө нь ердийн параметрүүд байж болно:
package main
import "fmt"
func мэндчилгээ(угтвар string, нэрс ...string) {
for _, нэр := range нэрс {
fmt.Println(угтвар + ", " + нэр + "!")
}
}
func main() {
мэндчилгээ("Сайн уу", "Болд", "Анар", "Сэлэнгэ")
fmt.Println("---")
мэндчилгээ("Баяртай", "найз")
}
Дэлгэцэнд:
Сайн уу, Болд!
Сайн уу, Анар!
Сайн уу, Сэлэнгэ!
---
Баяртай, найз!
Эхний аргумент угтвар нь ердийн string параметр. Дараах бүх аргументууд нэрс variadic параметрт орно.
fmt.Println хэрхэн ажилладаг вэ?
Энэ хичээлийг эхлүүлэхдээ fmt.Println variadic гэж хэлсэн. Одоо та үүнийг ойлгосон байх:
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 ойлгосноор функцүүд хэрхэн өгөгдлийг шууд өөрчилж чаддаг болохыг ойлгоно.