Szukaj…
Wprowadzenie
Funkcje w Go zapewniają zorganizowany kod wielokrotnego użytku do wykonywania zestawu działań. Funkcje upraszczają proces kodowania, zapobiegają nadmiarowej logice i ułatwiają śledzenie kodu. W tym temacie opisano deklarację i wykorzystanie funkcji, argumentów, parametrów, instrukcji return i zakresów w Go.
Składnia
- func () // typ funkcji bez argumentów i bez wartości zwracanej
- func (x int) int // przyjmuje liczbę całkowitą i zwraca liczbę całkowitą
- func (a, b int, z float32) bool // przyjmuje 2 liczby całkowite, jedną zmiennoprzecinkową i zwraca wartość logiczną
- func (ciąg prefiksu, wartości ... int) // funkcja „variadic”, która akceptuje jeden ciąg i jedną lub więcej liczb całkowitych
- func () (int, bool) // funkcja zwracająca dwie wartości
- func (a, b int, z float64, opt ... interface {}) (success bool) // akceptuje 2 liczby całkowite, jedną zmiennoprzecinkową i jedną lub więcej liczb interfejsów i zwraca nazwaną wartość boolowską (która jest już zainicjalizowana wewnątrz funkcji )
Podstawowa deklaracja
Prosta funkcja, która nie przyjmuje żadnych parametrów i nie zwraca żadnych wartości:
func SayHello() {
fmt.Println("Hello!")
}
Parametry
Funkcja może opcjonalnie zadeklarować zestaw parametrów:
func SayHelloToMe(firstName, lastName string, age int) {
fmt.Printf("Hello, %s %s!\n", firstName, lastName)
fmt.Printf("You are %d", age)
}
Zauważ, że typ dla firstName
został pominięty, ponieważ jest identyczny z lastName
.
Zwracane wartości
Funkcja może zwrócić wywołującą jedną lub więcej wartości:
func AddAndMultiply(a, b int) (int, int) {
return a+b, a*b
}
Drugą wartością zwracaną może być również błąd 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
}
Należy zwrócić uwagę na dwie ważne rzeczy:
- Nawias można pominąć dla pojedynczej wartości zwracanej.
- Każda instrukcja
return
musi zawierać wartość dla wszystkich deklarowanych wartości return.
Nazwane wartości zwrotne
Zwracane wartości można przypisać do zmiennej lokalnej. Pusta return
oświadczenie może być następnie wykorzystane do powrotu ich bieżące wartości. Jest to znane jako powrót „nagi” . Naga instrukcja return powinna być używana tylko w krótkich funkcjach, ponieważ szkodzą one czytelności w dłuższych funkcjach:
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
}
Należy zwrócić uwagę na dwie ważne rzeczy:
- Nawiasy wokół zwracanych wartości są obowiązkowe .
- Zawsze należy podać puste sprawozdanie
return
.
Dosłowne funkcje i zamknięcia
Prosta funkcja dosłowna, drukowanie Hello!
na standardowe wyjście:
package main
import "fmt"
func main() {
func(){
fmt.Println("Hello!")
}()
}
Dosłowna funkcja, wypisująca argument str
na standardowe wyjście:
package main
import "fmt"
func main() {
func(str string) {
fmt.Println(str)
}("Hello!")
}
Dosłowna funkcja zamykająca zmienną str
:
package main
import "fmt"
func main() {
str := "Hello!"
func() {
fmt.Println(str)
}()
}
Możliwe jest przypisanie funkcji dosłownej do zmiennej:
package main
import (
"fmt"
)
func main() {
str := "Hello!"
anon := func() {
fmt.Println(str)
}
anon()
}
Funkcje Variadic
Funkcję variadic można wywołać z dowolną liczbą końcowych argumentów. Te elementy są przechowywane w plasterku.
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")
}
Możesz także nadać plasterek funkcji variadic za pomocą ...
:
func main() {
strs := []string {"Str1", "Str2", "Str3"}
variadic(strs...)
}