Поиск…
Вступление
Функции в Go обеспечивают организованный, многоразовый код для выполнения набора действий. Функции упрощают процесс кодирования, предотвращают избыточную логику и упрощают выполнение кода. В этом разделе описывается декларация и использование функций, аргументов, параметров, операторов возврата и областей в Go.
Синтаксис
- func () // тип функции без аргументов и никакого возвращаемого значения
- func (x int) int // принимает целое число и возвращает целое число
- func (a, b int, z float32) bool // принимает 2 целых числа, один float и возвращает логическое
- func (префикс string, values ... int) // Функция «variadic», которая принимает одну строку и одно или несколько целых чисел
- func () (int, bool) // функция возвращает два значения
- func (a, b int, z float64, opt ... interface {}) (success bool) // принимает 2 целых числа, один float и одно или несколько число интерфейсов и возвращает с именем boolean value (которое уже инициализировано внутри функции )
Основная декларация
Простая функция, которая не принимает никаких параметров и не возвращает никаких значений:
func SayHello() {
fmt.Println("Hello!")
}
параметры
Функция может опционально объявлять набор параметров:
func SayHelloToMe(firstName, lastName string, age int) {
fmt.Printf("Hello, %s %s!\n", firstName, lastName)
fmt.Printf("You are %d", age)
}
Обратите внимание, что тип firstName
опущен, поскольку он идентичен lastName
.
Возвращаемые значения
Функция может возвращать одному или нескольким значениям вызывающему абоненту:
func AddAndMultiply(a, b int) (int, int) {
return a+b, a*b
}
Второе возвращаемое значение также может быть ошибкой var:
import errors
func Divide(dividend, divisor int) (int, error) {
if divisor == 0 {
return 0, errors.New("Division by zero forbidden")
}
return dividend / divisor, nil
}
Следует отметить две важные вещи:
- Скобки могут быть опущены для одного возвращаемого значения.
- Каждый оператор
return
должен предоставлять значение для всех объявленных возвращаемых значений.
Именованные возвращаемые значения
Возвращаемые значения могут быть назначены локальной переменной. Затем пустой оператор return
может быть использован для возврата своих текущих значений. Это называется «голым» возвратом. Голые заявления о возврате должны использоваться только в коротких функциях, поскольку они ухудшают читаемость в более длинных функциях:
func Inverse(v float32) (reciprocal float32) {
if v == 0 {
return
}
reciprocal = 1 / v
return
}
//A function can also return multiple values
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
Следует отметить две важные вещи:
- Скобки вокруг возвращаемых значений являются обязательными .
- Необходимо всегда указывать пустой оператор
return
.
Литературные функции и замыкания
Простая буквальная функция, печать Hello!
toddout:
package main
import "fmt"
func main() {
func(){
fmt.Println("Hello!")
}()
}
Буквальная функция, печатая аргумент str
в stdout:
package main
import "fmt"
func main() {
func(str string) {
fmt.Println(str)
}("Hello!")
}
Литеральная функция, закрывающая переменную str
:
package main
import "fmt"
func main() {
str := "Hello!"
func() {
fmt.Println(str)
}()
}
Можно назначить литеральную функцию переменной:
package main
import (
"fmt"
)
func main() {
str := "Hello!"
anon := func() {
fmt.Println(str)
}
anon()
}
Вариадические функции
VARIADIC функция может быть вызвана с любым числом аргументов задними. Эти элементы хранятся в срезе.
package main
import "fmt"
func variadic(strs ...string) {
// strs is a slice of string
for i, str := range strs {
fmt.Printf("%d: %s\n", i, str)
}
}
func main() {
variadic("Hello", "Goodbye")
variadic("Str1", "Str2", "Str3")
}
Вы также можете дать кусочек вариационной функции, с ...
:
func main() {
strs := []string {"Str1", "Str2", "Str3"}
variadic(strs...)
}