Co to jest", " (podkreślenie przecinka) w deklaracji Go?

A ja chyba nie rozumiem tego typu deklaracji zmiennych:

_, prs := m["example"]

Co dokładnie robi "_, " i dlaczego zadeklarowali taką zmienną zamiast

prs := m["example"]

(znalazłem to jako część przejdź przez przykład: Maps )

 108
Author: Tim Cooper, 2015-01-04

8 answers

Pozwala uniknąć konieczności deklarowania wszystkich zmiennych dla zwracanych wartości.
Nazywa się to pusty identyfikator.

Jak w:

_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate

W ten sposób nie musisz deklarować zmiennej, której nie użyjesz: Go na nią nie zezwoli. Zamiast tego, użyj'_', aby zignorować tę zmienną.

(inny przypadek użycia "_ " dotyczy importu )

Ponieważ odrzuca zwracaną wartość, jest to pomocne, gdy chcesz sprawdzić tylko jedną ze zwracanych wartości, jak w " Jak sprawdzić istnienie klucza na mapie?" pokazany w "efektywny Przejdź, Mapa":

_, present := timeZone[tz]

Aby sprawdzić obecność na mapie bez martwienia się o rzeczywistą wartość, możesz użyć pustego identyfikatora, prostego podkreślenia (_).
Pusty identyfikator może być przypisany lub zadeklarowany dowolną wartością dowolnego typu, z wartością odrzuconą bez szkody.
Aby sprawdzić obecność na mapie, Użyj pustego identyfikatora zamiast zwykłej zmiennej dla wartości.

Jako Jsor dodaje w komentarzach :

"ogólnie przyjętym standardem" jest wywołanie zmiennych testowych członkostwa " ok " (to samo dla sprawdzenia, czy odczyt kanału był poprawny, czy nie)

Który pozwala połączyć go z testem:

if _, err := os.Stat(path); os.IsNotExist(err) {
    fmt.Printf("%s does not exist\n", path)
}

Znajdziesz go również w pętli:

Jeśli potrzebujesz tylko drugiej pozycji w zakresie (wartość), Użyj pustego identyfikatora, podkreślenia, aby odrzucić pierwszy:

sum := 0
for _, value := range array {
    sum += value
}
 130
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-06 00:38:17

Kompilator Go nie pozwala na tworzenie zmiennych, których nigdy nie używasz.

for i, value := range x {
   total += value
}

Powyższy kod zwróci komunikat o błędzie "i declared and not used".

Ponieważ nie używamy i wewnątrz naszej pętli, musimy zmienić to na to:

for _, value := range x {
   total += value
}
 69
Author: Juni Brosas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-03 12:26:04

_ jest pustym identyfikatorem. Oznacza to, że wartość, którą należy przypisać, jest odrzucana.

Tutaj jest to wartość example klucza, który jest odrzucany. Druga linia kodu odrzuci wartość logiczną presence i zapisze wartość w prs.
Tak więc, aby sprawdzić tylko obecność na mapie, możesz odrzucić wartość. Można to wykorzystać do użycia mapy jako zestawu.

 4
Author: ThinkChaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-04 10:14:23

Pusty identyfikator może być używany, gdy składnia wymaga nazwy zmiennej, ale logika programu nie, na przykład do odrzucenia niechcianego indeksu pętli, gdy wymagamy tylko wartości elementu.

Fragment Z:

The Go Programming Language (Addison-Wesley Professional Computing Series)

Brian W. Kernighan]}

Ten materiał może być chroniony prawem autorskim.

 4
Author: koopertrooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-14 05:21:40

Jest nazywany pustym identyfikatorem i pomaga w przypadkach, gdy chcesz odrzucić wartość, która ma zostać zwrócona, a nie odwoływać się do niej

Niektóre miejsca, w których go używamy:

  • funkcja zwraca wartość i nie zamierzasz jej używać w future
  • chcesz iterować i potrzebujesz wartości i, której nie będziesz using
 2
Author: Anagha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 00:32:25

Zasadniczo, _, znany jako pusty identyfikator. W GO nie możemy mieć zmiennych, które nie są używane.

Jako przykład podczas iteracji przez tablicę, jeśli używasz value: = range nie chcesz wartości i do iteracji. Ale jeśli pominiesz wartość i, zwróci błąd. Ale jeśli zadeklarujesz, że nie użyłem go, zwróci również błąd.

Dlatego jest to miejsce, w którym musimy użyć _,.

Jest również używany, gdy nie chce zwracać wartości funkcji w przyszłości.

 2
Author: Kaveen Hyacinth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-03 02:11:39

Najlepszym przypadkiem użycia nieużywanej zmiennej jest sytuacja, w której potrzebne jest tylko częściowe wyjście. W poniższym przykładzie musimy tylko wydrukować wartość (populacja stanu).

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}
 2
Author: monkrus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-11 00:23:35

Nieużywana zmienna jest niedozwolona w Golang

Jeśli pochodzicie z innych języków programowania, może to wydawać się trochę trudne do przyzwyczajenia. Ale to skutkuje bardziej czystszym kodem. Więc używając _ mówimy, że wiemy, że istnieje zmienna, ale nie chcemy jej używać i mówimy kompilatorowi, który nie narzeka na to. :)

 1
Author: Krishnadas PC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-27 09:33:36