Loading...

Функциялар жана алардын параметрлери

Функция белгилүү бир тапшырманы чогуу аткарган билдирүүлөр блогун билдирет. Функциялардын жардамы менен сиз анын операторлор блогун программанын башка бөлүктөрүндө бир бирдик катары кайра-кайра чакыра аласыз.

 

Функция төмөнкүдөй жарыяланды:

func имя_функции (список_параметров) (типы_возвращаемых_значений){

    выполняемые_операторы

}

Функция func ачкыч сөзүнөн кийин функциянын аты менен аныкталат. Андан кийин, кашаанын ичинде, параметрлердин тизмеси бар. Параметрлердин тизмесинен кийин функциядан кайтарылган маанилердин түрлөрү (эгерде функция маанилерди кайтарса) аныкталат. Анан тармал кашааларда функцияны түзгөн чыныгы операторлор бар.

 

Функциянын аталышы, анын параметр түрлөрү жана кайтаруу түрлөрү менен бирге кол тамга деп да аталат .

 

Демейки боюнча, ар бир Go программасы жок дегенде бир функцияны камтышы керек, негизги функция , бул колдонмонун кирүү чекити:

 

package main

import "fmt"

 

func main() {

    fmt.Println("Hello Go")

}

Негизги функция func ачкыч сөзүнөн башталат, андан кийин main деген ат келет. Функция эч кандай параметрди албайт, ошондуктан аталыштан кийин бош кашаалар бар. Негизги функция эч кандай жыйынтык бербейт, ошондуктан кайтаруу түрү бош кашаадан кийин көрсөтүлбөйт. Ал эми тармал кашаалардагы функциянын корпусу чындыгында fmt.Println()консолго сапты басып чыгарган башка функцияга чакыруудан турат - .

 

Эми башка функцияны аныктайлы:

 

package main

import "fmt"

 

func main() {

 

}

 

func hello(){

    fmt.Println("Hello World")

}

Бул учурда, биз эч кандай параметрди албаган, эч нерсе кайтарбаган жана жөн гана консолго сапты басып чыгарган hello функциясын аныктадык. Сиз бир эле файлдагы функцияны негизги функция менен аныктай аласыз. Бирок бул программаны иштетсек, консолдо эч нерсе көрбөйбүз. Анткени программа негизги функциянын ичинде аныкталган аракеттерди гана аткарат. Аты - бул колдонмонун кирүү чекити. Эгерде биз программада функциябызды аткаргыбыз келсе hello, анда аны негизги функцияда чакырышыбыз керек:

package main

import "fmt"

 

func main() {

    hello()

    hello()

    hello()

}

 

func hello(){

    fmt.Println("Hello World")

}

Функцияны чакыруу үчүн анын аты жазылат, андан кийин функциянын параметрлеринин маанилери кашаанын ичинде көрсөтүлөт. Бирок бул учурда hello функциясынын параметри жок болгондуктан, анын атынан кийин жөн гана бош кашааларды жазабыз. Ошентип, программа аткарылганда, "Hello World" сапы консолдо үч жолу көрсөтүлөт:

 

Hello World

Hello World

Hello World

Ошентип, операторлор тобун функция катары долбоорлоо операторлордун бардык тобун ар бир жолу жазууга эмес, аларга функциянын аталышы менен кайрылууга мүмкүндүк берет.

 

Функциянын параметрлери

Функция киргизилген маалыматтарды параметрлер аркылуу кабыл алат. Параметрлер функциянын атынан кийин кашаанын ичинде көрсөтүлөт. Ар бир параметрге ат жана тип берилет (өзгөрмө үчүн). Параметрлер бири-биринен үтүр менен бөлүнгөн. Функцияны чакырып жатканда, анын бардык параметрлери үчүн маанилерди өткөрүп беришиңиз керек. Мисалы, биз каалаган эки санды кошо турган функцияны колдонгубуз келет:

package main

import "fmt"

 

func main() {

    add(4, 5)   // x + y = 9

    add(20, 6)  // x + y = 26

}

 

func add(x int, y int){

    var z = x + y

    fmt.Println("x + y = ", z)

}

Кошуу функциясынын эки параметри бар: x жана y. Эки параметр тең int тибинде, башкача айтканда, бүтүн сандар. Функция өзү бул сандардын суммасын сактаган өзгөрмө аныктайт. Анан сандардын суммасы консолго басылып чыгат.

 

Негизги функцияда кошуу функциясы чакырылат. Функция эки параметрди алгандыктан, ал чакырылганда, бул параметрлердин же эки аргументтин маанилери берилиши керек. Мындан тышкары, бул баалуулуктар түрү параметрлерине ылайык келиши керек. Башкача айтканда, эгерде параметр int түрүн көрсөтсө, анда ага сан берилиши керек.

 

Маанилер позиция боюнча өткөрүлөт. Башкача айтканда, биринчи маани биринчи параметрди алат, экинчи маани киргизүү параметрин алат ж.б.у.с. Натыйжада, биз төмөнкү консолдук натыйжаны алабыз:

 

1

2

x + y = 9

x + y = 26

Эгерде катардагы бир нече параметрлер бир түргө ээ болсо, анда биз түрүн акыркы параметр үчүн гана белгилей алабыз жана мурунку параметрлер да бул типти көрсөтөт:

package main

import "fmt"

 

func main() {

    add(1, 2, 3.4, 5.6, 1.2)

}

func add(x, y int, a, b, c float32){

    var z = x + y

    var d = a + b + c

    fmt.Println("x + y = ", z)

    fmt.Println("a + b + c = ", d)

}

Функцияны чакырганда аргумент катары сиз өзгөрмөлөрдүн маанилерин, операциялардын же башка функциялардын натыйжаларын да өткөрө аласыз, бирок функцияга аргумент ар дайым маани боюнча берилээрин эске алуу керек:

package main

import "fmt"

 

func main() {

    var a = 8

    fmt.Println("a before: ", a)

    increment(a)

    fmt.Println("a after: ", a)

}

func increment(x int){

 

    fmt.Println("x before: ", x)

    x = x + 20

    fmt.Println("x after: ", x)

}

Консол чыгаруу:

 

а чейин: 8 жолу

мурун: 8 жолу

кийин: 28

а кийин: 8

Бул учурда a өзгөрмөнүн мааниси өсүү функциясына аргумент катары берилет. Параметр х бул маанини алат жана ал 20га көбөйөт. Бирок, х параметринин мааниси жогорулаганына карабастан, a өзгөрмөнүн мааниси эч кандай өзгөргөн жок. Анткени функция чакырылганда өзгөрмөнүн маанисинин көчүрмөсү өткөрүлөт.

 

Параметрлердин аныкталбаган саны

Go'до функция бир типтеги чексиз сандагы параметрлерди ала алат. Мисалы, сандардын суммасын алышыбыз керек, бирок функцияга канча сан өтөөрүн так билбейбиз:

 

package main

import "fmt"

 

func main() {

    add(1, 2, 3)        // sum = 6

    add(1, 2, 3, 4)     // sum = 10

    add(5, 6, 7, 2, 3)  // sum = 23

}

 

func add(numbers ...int){

    var sum = 0

    for _, number := range numbers{

        sum += number

    }

    fmt.Println("sum = ", sum)

}

Маанилердин чексиз санын билдирген параметрди аныктоо үчүн, бул маанилердин түрүнүн алдына эллипс менен белгилеңиз: numbers ...int. Башкача айтканда, окшош параметр аркылуу биз int түрүндөгү бир нече маанилерди алабыз.

 

Чалуу учурунда биз кошуу функциясына башка сандагы сандарды бере алабыз:

 

add(1, 2, 3)        // sum = 6

add(1, 2, 3, 4)     // sum = 10

add(5, 6, 7, 2, 3)  // sum = 23

Бул учурду параметр катары кесип өтүүдөн айырмалоо керек:

 

add([]int{1, 2, 3})

add([]int{1, 2, 3, 4})

add([]int{5, 6, 7, 2, 3})

Бул учурда, биз ката алабыз, анткени кесимден өтүү бир типтеги чексиз сандагы параметрлерди өткөрүүгө барабар эмес. Эгерде биз кесимден өтүүнү кааласак, анда массив аргументинен кийин эллипсти көрсөтүшүбүз керек:

 

add([]int{1, 2, 3}...)

 

add([]int{1, 2, 3, 4}...)

 

var nums = []int{5, 6, 7, 2, 3}

add(nums...)