19.10.2022 в 10:47
Тим Тоуди
Функции Golang как и другие типы
- Переменные могут быть объявлены с типом функции
- Функция в качестве аргументов
- Функция в качестве возвращаемых значений
Переменные как функции
Мы могли бы объявить переменную как функцию.
package main
import "fmt"
func Doubler(d int) int {
return d * 2
}
func main() {
var funVar func(int) int // declare a variable as a function
funVar = Doubler // here we have assigned a function to a variable. Note: We haven't called the function using ().
fmt.Println(funVar(2))
fmt.Println(funVar(10))
}
В приведенном выше коде у нас есть:
- функция с именем Doubler, который импеет параметр int и возвращаемый тип int. Эта простая функция просто удваивает заданное значение и возвращает его.
- в основе функции мы объявили переменную, как функцию. Функция funVar имеет тип функции с параметром int и типом возвращаемого значения
func(int) int - сингатура функции
- присвоил функцию Doubler переменной funVar, поскольку они соответствуют типам
- и теперь funVar можно вызвать в любое время с аргументом int, чтобы получить результат
Функции как аргумент
Функция может быть передана в качестве аргумента другой функции
package main
import "fmt"
func Doubler(d int) int {
return d * 2
}
// function that takes function[func(int) int] as an argument
func CallIt(f func(int) int, v int) {
fmt.Println(f(v))
}
func main() {
CallIt(Doubler, 2)
CallIt(Doubler, 10)
}
- CallIt - это функция, которая принимает функцию в качестве аргумента и вызывает функцию со значением, которое мы предоставили в качестве другого аргумента
Функции как возвращаемые значения
Функции могут возвращать функции
package main
import "fmt"
// Doubler function returns function with int parameter and int return type
func Doubler() func(int) int {
return func(x int) int { return x * 2 }
}
// same as Doubler function but DoublerWithOwnValue function return the function with no parameter and int return type.
// Point to note: the function returned by this function uses the variable x declared inside the DoublerWithOwnValue function.
//
// which means if the value of the x is altered then it will be affected at the function call.
func DoublerWithOwnValue() func() int {
x := 10
f := func() int { return x * 2 }
//x = 200 // if this line is uncommented then while calling the returned function we will get the double of 200 which is 400
return f
}
func main() {
f := Doubler()
fmt.Println(f(5))
fmt.Println(f(15))
f1 := DoublerWithOwnValue()
fmt.Println(f1())
}
Тип функции
Ниже приведен простой код, чтобы показать вам, что мы также могли бы создать отдельный тип, используя сигнатуру функции, и делать с этим типом все, что захотим.
package main
import "fmt"
// declare a function type using function signature
type Greeter func(name string) string
// Morning method with the Greeter receiver type
func (g Greeter) Morning(n string) string {
return "Good Morning! " + n
}
func main() {
// using the Greeter function type
var gtr Greeter
user := "Logesh"
gtr = func(n string) string { return "Hello, " + n }
fmt.Println(gtr(user))
fmt.Println(gtr.Morning(user))
}
Подводя итог, можно уверенно сказать, что функция обрабатывается также, как и любые другие типы