Poniżej znajduje się fragment kodu Go, o który mam pytanie. A konkretnie, co jest a
w tej funkcji?
func DPrintf(format string, a ...interface{}) (n int, err error) {
if Debug > 0 {
n, err = fmt.Printf(format, a...)
}
return
}
Czy ktoś mógłby mi powiedzieć, jakie są tutaj trzy kropki? A co robi ...interface{}
?
Odpowiedzi:
Typ parametru poprzedzony trzema kropkami (...) nazywany jest parametrem wariadycznym . Oznacza to, że możesz przekazać dowolną liczbę lub argumenty do tego parametru (tak jak w przypadku
fmt.Printf()
). Funkcja otrzyma listę argumentów dla parametru jako wycinek typu zadeklarowanego dla parametru ([]interface{}
w twoim przypadku). The Go Specyfikacja stanowi:Parametr:
a ...interface{}
Czy dla funkcji równoważnej:
a []interface{}
Różnica polega na sposobie przekazywania argumentów do takiej funkcji. Odbywa się to przez podanie każdego elementu wycinka osobno lub jako pojedynczy wycinek, w którym to przypadku będziesz musiał dodać przyrostek wartości wycinka trzema kropkami. Poniższe przykłady spowodują to samo wywołanie:
fmt.Println("First", "Second", "Third")
Zrobi to samo, co:
s := []interface{}{"First", "Second", "Third"} fmt.Println(s...)
Jest to całkiem dobrze wyjaśnione w specyfikacji Go :
źródło
Jeśli chodzi o
interface{}
termin, jest to pusty interfejs. Innymi słowy, interfejs implementowany przez wszystkie zmienne w Go.Jest to trochę analogiczne do
java.lang.Object
lubSystem.Object
w C #, ale zamiast tego obejmuje każdy typ zmiennej w języku. Pozwala więc przekazać do metody wszystko.źródło