GoDasturchi
Build Your Own Functions

Build Your Own Functions

Hozirgacha barcha kodingiz main() ichida yashadi. Bu kichik dasturlar uchun ishlaydi, lekin bir xil logika bir nechta joyda kerak bo'lsa-chi?

example.go
// yuklashdan oldin...
if fileSizeMB > bandwidthMB { fmt.Println("too large") }

// yuklab olishdan oldin...
if fileSizeMB > bandwidthMB { fmt.Println("too large") }

Agar tekshiruv ishlash tarzini o'zgartirish kerak bo'lsa, har bir nusxani yangilashingiz kerak bo'ladi. Funksiyalar buni hal qiladi. Siz logikani bir marta yozasiz, unga nom berasiz va kerak bo'lgan joyda chaqirasiz.

Funksiyaning tuzilishi

example.go
func remainingSpace(diskMB, fileMB int) int {
	return diskMB - fileMB
}

left := remainingSpace(1000, 350) // left is 650
QISMMISOLNIMA QILADI
Kalit so'zfuncGo'ga funksiya aniqlayotganingizni bildiradi
NomremainingSpaceBu funksiyani keyinroq qanday chaqirasiz
Parametrlar(diskMB, fileMB int)Funksiyaga kerak bo'lgan kirishlar. Tartib muhim: 1000diskMB ga, 350fileMB ga boradi
Qaytish turiintFunksiya qaytaradigan qiymat turi
returnreturn diskMB - fileMBChaqiruvchiga qiymat yuboradi va funksiyadan chiqadi. Qaytish turiga mos bo'lishi kerak

Agar ikkita parametr bir xil turga ega bo'lsa, uni faqat bir marta yozasiz: diskMB, fileMB intdiskMB int, fileMB int o'rniga.

Funksiyalar faqat butun sonlar bilan cheklanmagan, va ular ayirish qilishi ham shart emas. Mana satr qabul qilib, satr qaytaradigan funksiya:

example.go
func fullPath(dir, file string) string {
	return dir + "/" + file
}

path := fullPath("/var/log", "server.log") // path is "/var/log/server.log"

Ish qanday tur va amallarni talab qilsa, ichida shular bo'ladi.

Har bir funksiya biror narsa qaytarishi shart emas. Agar qaytish turi bo'lmasa, return kalit so'zi umuman kerak emas:

example.go
func logTransfer(filename string) {
	fmt.Println("Transferring:", filename)
}

>_ Exercise

downloadTime(fileSizeMB, speedMBps int) int nomli funksiya yozing, bunda fileSizeMB — fayl hajmi megabaytlarda, speedMBps esa yuklab olish tezligi (sekundiga megabayt).

Agar tezlik nol yoki manfiy bo'lsa, noto'g'ri tezlikni bildirish uchun -1 qaytaring. Aks holda, fileSizeMB / speedMBps ni qaytaring.

Misollar:

  • downloadTime(500, 50)10
  • downloadTime(1000, 100)10
  • downloadTime(100, 0)-1 (nolga bo'lib bo'lmaydi)

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Funksiyani bir marta aniqlang, uni istalgan joyda chaqiring. Agar logika o'zgarsa, uni faqat bitta joyda tuzatasiz.

NEXT UP

Multiple Return Values

🔒🔒🔒🔒
OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Build Your Own Functions

Hozirgacha barcha kodingiz main() ichida yashadi. Bu kichik dasturlar uchun ishlaydi, lekin bir xil logika bir nechta joyda kerak bo'lsa-chi?

example.go
// yuklashdan oldin...
if fileSizeMB > bandwidthMB { fmt.Println("too large") }

// yuklab olishdan oldin...
if fileSizeMB > bandwidthMB { fmt.Println("too large") }

Agar tekshiruv ishlash tarzini o'zgartirish kerak bo'lsa, har bir nusxani yangilashingiz kerak bo'ladi. Funksiyalar buni hal qiladi. Siz logikani bir marta yozasiz, unga nom berasiz va kerak bo'lgan joyda chaqirasiz.

Funksiyaning tuzilishi

example.go
func remainingSpace(diskMB, fileMB int) int {
	return diskMB - fileMB
}

left := remainingSpace(1000, 350) // left is 650
QISMMISOLNIMA QILADI
Kalit so'zfuncGo'ga funksiya aniqlayotganingizni bildiradi
NomremainingSpaceBu funksiyani keyinroq qanday chaqirasiz
Parametrlar(diskMB, fileMB int)Funksiyaga kerak bo'lgan kirishlar. Tartib muhim: 1000diskMB ga, 350fileMB ga boradi
Qaytish turiintFunksiya qaytaradigan qiymat turi
returnreturn diskMB - fileMBChaqiruvchiga qiymat yuboradi va funksiyadan chiqadi. Qaytish turiga mos bo'lishi kerak

Agar ikkita parametr bir xil turga ega bo'lsa, uni faqat bir marta yozasiz: diskMB, fileMB intdiskMB int, fileMB int o'rniga.

Funksiyalar faqat butun sonlar bilan cheklanmagan, va ular ayirish qilishi ham shart emas. Mana satr qabul qilib, satr qaytaradigan funksiya:

example.go
func fullPath(dir, file string) string {
	return dir + "/" + file
}

path := fullPath("/var/log", "server.log") // path is "/var/log/server.log"

Ish qanday tur va amallarni talab qilsa, ichida shular bo'ladi.

Har bir funksiya biror narsa qaytarishi shart emas. Agar qaytish turi bo'lmasa, return kalit so'zi umuman kerak emas:

example.go
func logTransfer(filename string) {
	fmt.Println("Transferring:", filename)
}

>_ Exercise

downloadTime(fileSizeMB, speedMBps int) int nomli funksiya yozing, bunda fileSizeMB — fayl hajmi megabaytlarda, speedMBps esa yuklab olish tezligi (sekundiga megabayt).

Agar tezlik nol yoki manfiy bo'lsa, noto'g'ri tezlikni bildirish uchun -1 qaytaring. Aks holda, fileSizeMB / speedMBps ni qaytaring.

Misollar:

  • downloadTime(500, 50)10
  • downloadTime(1000, 100)10
  • downloadTime(100, 0)-1 (nolga bo'lib bo'lmaydi)

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Funksiyani bir marta aniqlang, uni istalgan joyda chaqiring. Agar logika o'zgarsa, uni faqat bitta joyda tuzatasiz.

NEXT UP

Multiple Return Values