2016-05-06 9 views
6

Kam über die folgende Funktion here. Ich bemerkte, dass der letzte Parameter mit _ identifiziert wird. Was ist die Absicht dieses Musters?Bedeutung der Unterstreichung in einem Go-Funktionsparameter

func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { 
    fmt.Fprint(w, "Welcome!\n") 
} 
+1

In Verbindung stehende Fragen: 1. [Methoden-Parameternamen in Golang erhalten] (http://stackoverflow.com/questions/31377433/getting-method-parameter-names-in-golang); 2. [Warum erlaubt Go die Kompilierung nicht verwendeter Funktionsparameter?] (Http://stackoverflow.com/questions/22549228/why-does-go-allow-compilation-of-unused-function-parameters) – icza

Antwort

7

Es bedeutet „diesen Parameter ignorieren“, der Grund, dass sie immer noch der letzte Parameter hier brauchen, ist, weil sie es als type Handle auf die Funktion GET, die die Signatur übergeben möchten:

type Handle func(http.ResponseWriter, *http.Request, Params)

Wenn Sie einfach etwas wie func Index(w http.ResponseWriter, r *http.Request) übergeben, wird es nicht als type Handle behandelt.

5

_ ist die blank identifier. In der Signatur wird angezeigt, dass der Wert nicht verwendet wird, sodass die Signatur weiterhin mit den Methoden der Schnittstelle übereinstimmt.

1

Wie andere darauf hingewiesen haben, ist es ein blank identifier. Betrachten wir zum Beispiel das folgende Beispiel:.

func main() { 
    nums := []int{5, 3, 4} 
    max := nums[0] 
    for _, num := range nums { 
     if num > max { 
      max = num 
     } 
    } 
    fmt.Println("max:", max) 
} 

Wenn Sie nicht gehen, um einen Indexwert verwenden, können Sie einfach ignorieren sie die Speicherung von _ anstelle eines Variablennamen =.

+1

Die Frage des OP ist über Funktionsparameter. Ich glaube nicht, dass Sie die Frage beantworten. – Akavall

0

Die Verwendung von "_" anstelle eines Parameternamens erfüllt die Pflichten einer übergeordneten "Funktion als Parameter", ohne dass eine Warnung über einen nicht verwendeten Parameter ausgegeben wird. In Ihrem Fall glaube ich, dass der Compiler angewiesen wird, alle ankommenden "POST" -Daten zu ignorieren, wodurch die Anforderung auf die Funktionalität eines "GET" reduziert wird.