Loading...

Функциядан жыйынтыкты кайтаруу

 

Функциялар натыйжаны кайтара алат. Бул үчүн, функциянын параметрлеринин тизмесинен кийин кайтарылган натыйжанын түрүн көрсөтүңүз. Ал эми функциянын денесинде return операторун колдонуңуз , андан кийин кайтаруу мааниси көрсөтүлөт:

 

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

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

    return возвращаемое_значение

}

Мисалы, биз функциядан эки сандын суммасын кайтаргыбыз келет:

 

package main

import "fmt"

 

func main() {

    var a = add(4, 5)   // 9

    var b = add(20, 6)  // 26

    fmt.Println(a)

    fmt.Println(b)

}

 

func add(x, y int) int {

    return x + y

}

Add функциясы int түрүндөгү маанини кайтарат, андыктан бул түрү параметр тизмесинен кийин келтирилет. Функциянын өзүндө return операторунан кийин кайтаруу мааниси көрсөтүлөт. Бул учурда, бул маани өзгөрмөнүн мааниси, литерал же бул жагдайдагыдай операциянын же функциянын чакырылышынын натыйжасы болушу мүмкүн. Башкача айтканда, туюнтма x + y кайтаруу маанисин аныктайт.

 

Функция маанини кайтаргандыктан, функция чакырылганда, биз бул маанини алып, аны өзгөрмөгө өткөрүп алабыз:

var a = add(4, 5)   // 9

var b = add(20, 6)  // 26

Натыйжаларды кайтаруу

Кайтарылган натыйжаны атаса болот:

func add(x, y int) (z int) {

    z = x + y

    return

}

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

func add(x, y int) int {

    var z int = x + y

    return z

}

Бир нече баалуулуктарды кайтаруу

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

он төрт

package main

import "fmt"

 

func main() {

    var age, name = add(4, 5, "Tom", "Simpson")

    fmt.Println(age)    // 9

    fmt.Println(name)   // Tom Simpson

}

 

func add(x, y int, firstName, lastName string) (int , string) {

    var z int = x + y

    var fullName = firstName + " " + lastName

    return z, fullName

}

Кошуу функциясы төрт параметрди алат: эки сан жана эки сап. Санды (int мааниси) жана сапты кайтарат. Кайтаруу маанилери кайтаруу билдирүүсүнөн кийин көрсөтүлөт.

 

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

 

var age, name = add(4, 5, "Tom", "Simpson")

Биринчи кайтаруу мааниси биринчи өзгөрмөнүн жашына, ал эми экинчи маани экинчи өзгөрмөнүн атына өткөрүлөт.

 

Функциянын натыйжаларын өзгөрмөлөргө өткөрүүнүн альтернативалуу жолу:

 

age, name := add(4, 5, "Tom", "Simpson")

Ошондой эле бул учурда аталган натыйжаларды колдонууга болот:

 

func add(x, y int, firstName, lastName string) (z int, fullName string) {

    z = x + y

    fullName = firstName + " " + lastName

    return

}

Функция түрү

 

Ар бир функциянын белгилүү бир түрү бар, ал параметр типтеринин тизмесинен жана кайтаруу натыйжаларынын түрлөрүнүн тизмесинен туратМисалы, төмөнкү функцияны алыңыз:

1

2

3

func add(x int, y int) int{

    return x + y

}

Бул функция func(int, int) int түрүн билдирет . Төмөнкү функция ошол эле түргө туура келет:

1

2

3

func multiply(x int, y int) int{

return x * y

}

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

Дагы бир функцияны алалы:

1

2

3

func display(message string){

    fmt.Println(message)

}

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

package main

 

import "fmt"

 

func add(x int, y int) int{

    return x + y

}

 

func main() {

     

    var f func(int, int) int = add

    fmt.Println(f(3, 4))

     

    var x = f(4, 5)     // 9

    fmt.Println(x)

}

Бул жерде f өзгөрмө түрү func(int, int) int, башкача айтканда, ал эки int параметрин кабыл алып, int маанисин кайтарган каалаган функцияны билдирет. Ошондуктан, биз бул өзгөрмөгө берилген түргө дал келген кошуу функциясын дайындай алабыз:

1

var f func(int, int) int = add

Андан кийин, биз анын параметрлери үчүн керектүү маанилерди өткөрүп, өзгөрмө аркылуу дайындалган функцияны чакыра алабыз:

1

var x = f(4, 5) // 9

Бул учурда, өзгөрмө өзү көрсөткөн функцияны өзгөртө алат, бирок функция сөзсүз түрдө анын түрүнө дал келиши керек:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

package main

 

import "fmt"

 

func add(x int, y int) int{ return x + y}

func multiply(x int, y int) int{ return x * y}

 

func display(message string){

    fmt.Println(message)

}

 

func main() {

     

    f := add        //или так var f func(int, int) int = add

    fmt.Println(f(3, 4))        // 7

     

    f = multiply    // теперь переменная f указывает на функцию multiply

    fmt.Println(f(3, 4))        // 12

     

    // f = display      // ошибка, так как функция display имеет тип func(string)

     

    var f1 func(string) = display   // норм

    f1("hello")

}

Башка функцияларга параметр катары функцияларды аткарат

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

package main

 

import "fmt"

 

func add(x int, y int) int {

     

    return x + y

}

func multiply(x int, y int) int {

     

    return x * y

}

func action(n1 int, n2 int, operation func(int, int) int){

 

    result := operation(n1, n2)

    fmt.Println(result)

}

func main() {

     

    action(10, 25, add)     // 35

    action(5, 6, multiply)  // 30

}

Бул жерде функция actionүч параметрди алат. Биринчи эки параметр сандар, ал эми үчүнчү параметр түргө дал келген функция: func(int , int) int. Башкача айтканда, үчүнчү параметр кандайдыр бир иш-аракетти билдирет жана эки int маанисин алган, ошондой эле int маанисин кайтарган каалаган функция менен көрсөтүлүшү мүмкүн. Мисалы, бул жерде ушул түргө дал келген эки окшош функция аныкталган: кошуу жана көбөйтүү. Операция параметринин аталышы аркылуу биз бул функцияны чакыра алабыз.

Же дагы бир мисал:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

package main

 

import "fmt"

 

func isEven(n int) bool{

    return n % 2 == 0

}

func isPositive(n int) bool{

    return n > 0

}

 

func sum(numbers []int, criteria func(int) bool) int{

 

    result := 0

    for _, val := range numbers{

        if(criteria(val)){

            result += val

        }

    }

    return result

}

func main() {

     

    slice := []int{-2, 4, 3, -1, 7, -4, 23}

     

    sumOfEvens := sum(slice, isEven)    // сумма четных чисел

    fmt.Println(sumOfEvens)             // -2

     

    sumOfPositives := sum(slice, isPositive)    // сумма положительных чисел

    fmt.Println(sumOfPositives)                 // 37

}

Бул жерде сумма функциясы кесимдин элементтеринин суммасын эсептейт. Бирок n бардык элементтер, бирок шартка дал келгендер гана. Шарт экинчи параметр катары функция катары өткөрүлөт. Шарт түрдөгү функцияга дал келиши керек func(int) bool. Башкача айтканда, функция параметр катары int маанисин кабыл алышы керек жана берилген сан шартка дал келерин көрсөткөн bool маанисин кайтарышы керек.

Мисал катары, бул жерде дагы эки жардамчы функция аныкталган: isEven (сан жуп болсо, чындыкты кайтарат) жана isPositive (эгер сан оң болсо, чындыкты кайтарат). Бул функциялар түргө дал келет, func(int) boolошондуктан алар шарт катары колдонулушу мүмкүн.