Що таке "_" (підкреслена кома) у декларації Go?


100

І я, здається, не розумію такого роду оголошення змінних:

_, prs := m["example"]

Що саме " _," робить і чому вони оголосили таку змінну замість

prs := m["example"]

(Я знайшов його як частину Go by Example: Maps )


3
Щодо майбутніх питань щодо мови, спочатку подивіться на специфікацію . Він повинен відповісти на всі ваші запитання.
fuz

Як коментар: prsймовірно, означає "присутній". Код у вашому прикладі перевіряє наявність або відсутність запису "example"на mкарті.
dyoo

6
@FUZxxl Так, я раніше там заглядав, але оскільки я не знав назви функції, я її не знайшов. Крім того, я вважаю, що офіційні характеристики мов програмування не надто педагогічні, і навчитися на прикладах.
Kansuler

@dyoo Як тільки у мене було пояснення нижче, я зрозумів, що це означає, але варто зазначити, якщо хтось ще має таке саме питання!
Кансулер

8
@FUZxxl: Не знаю. На більшість запитань щодо SO, можливо, десь є відповіді . Існує певний поріг, під яким, мабуть, не слід ставити запитання, але я не думаю, що це питання під цим.
чт

Відповіді:


120

Це дозволяє уникнути необхідності оголошувати всі змінні для повернених значень.
Він називається порожнім ідентифікатором .

А саме:

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

( інший _варіант використання - для імпорту )

Оскільки воно відкидає повернене значення, корисно, коли ви хочете перевірити лише одне з повернутих значень, як у " Як перевірити наявність ключа на карті? ", Показаному в " Ефективний перехід, карта ":

_, present := timeZone[tz]

Щоб перевірити наявність на карті, не турбуючись про фактичне значення, ви можете використовувати порожній ідентифікатор, просте підкреслення ( _).
Порожній ідентифікатор може бути призначений або оголошений з будь-яким значенням будь-якого типу, при цьому значення нешкідливо відкидається.
Для перевірки присутності на карті використовуйте порожній ідентифікатор замість звичайної змінної значення.

Як додає Jsor у коментарях :

"загальноприйнятим стандартом" є виклик змінних тесту на приналежність "добре" (те саме для перевірки, чи справді прочитане каналом було чи ні)

Це дозволяє поєднувати його з тестом:

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

Ви також знайдете його в циклі:

Якщо вам потрібен лише другий елемент у діапазоні (значення), використовуйте порожній ідентифікатор, підкреслення, щоб відкинути перший:

sum := 0
for _, value := range array {
    sum += value
}

Дякую за хороший приклад. Мені знадобилося трохи роздумів, щоб зрозуміти концепцію, але зараз я це розумію!
Kansuler

Зверніть увагу, що загальновизнаним стандартом IME є виклик змінних тесту на приналежність "добре" (те саме, щоб перевірити, чи справжнє зчитування каналу).
LinearZoetrope

1
@Jsor Я згоден. Я включив ваш коментар у відповідь для більшої видимості та додав кілька додаткових прикладів.
VonC

63

Компілятор Go не дозволяє створювати змінні, які ви ніколи не використовуєте.

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

Наведений вище код поверне повідомлення про помилку "Я оголосив і не використовую".

Оскільки ми не використовуємо i всередині нашого циклу, нам потрібно змінити його на такий:

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

12
Ваше перше речення було важливим, щоб зрозуміти причину, чому _ є порожнім ідентифікатором.
Тарік

4

_- порожній ідентифікатор. Це означає, що значення, яке йому слід призначити, відкидається.

Тут exampleвідкидається значення ключа. Другий рядок коду відкине логічне значення присутності та збереже значення в prs.
Отже, щоб перевірити лише присутність на карті, ви можете відкинути значення. Це може бути використано для використання карти як набору.


3

Порожній ідентифікатор може використовуватися, коли синтаксис вимагає імені змінної, але логіка програми цього не робить, наприклад, щоб відкинути індекс небажаного циклу, коли нам потрібне лише значення елемента.

Витяг з:

Мова програмування Go (серія професійних обчислень Аддісона-Веслі)

Брайан В. Керніган

Цей матеріал може бути захищений авторським правом.


2

Він називається порожнім ідентифікатором і допомагає у випадках, коли ви хочете відкинути значення, яке збирається повернути, а не посилатися на нього

Деякі місця, де ми його використовуємо:

  • Функція повертає значення, і ви не маєте наміру використовувати його в майбутньому
  • Ви хочете повторити і вам потрібно значення i, яке ви не будете використовувати

2

Великим варіантом використання невикористовуваної змінної є ситуація, коли вам потрібен лише частковий результат. У наведеному нижче прикладі нам потрібно лише надрукувати значення (сукупність штатів).

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}

1

В основному, _,відомий як порожній ідентифікатор. У GO ми не можемо мати змінних, які не використовуються.

Як приклад, коли ви перебираєте масив, якщо ви використовуєте value: = range, ви не хочете i значення для ітерації. Але якщо ви пропустите значення i, це призведе до помилки. Але якщо ви оголосите i і не використовували його, воно також поверне помилку.

Отже, це місце, де ми маємо використовувати _,.

Також він використовується, коли ви не хочете повертати значення функції в майбутньому.


0

У Golang не використовується невикористана змінна

Якби ви походили з інших мов програмування, вам може бути складно звикнути до цього. Але це призводить до більш чистого коду. Отже, використовуючи _ми, ми говоримо, що знаємо, що там є змінна, але ми не хочемо її використовувати і повідомляємо компілятору, який не скаржиться на це. :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.