Показаны сообщения с ярлыком объявления переменных в Go. Показать все сообщения
Показаны сообщения с ярлыком объявления переменных в Go. Показать все сообщения

среда, 23 декабря 2020 г.

Go style guides: объявления локальных переменных

Краткие объявления переменных ( := ) следует использовать, если для переменной явно задано какое-либо значение.

Менее удачный пример:

var s = "foo"

Более удачный пример:

s := "foo"

Однако бывают случаи, когда значение по умолчанию яснее при использовании ключевого слова var. Например, объявление пустых срезов.

Менее удачный пример:

func f(list []int) {
    filtered := []int{}
    for _, v := range list {
        if v > 10 {
            filtered = append(filtered, v)
        }
    }
}

Более удачный пример:

func f(list []int) {
    var filtered []int
    for _, v := range list {
        if v > 10 {
            filtered = append(filtered, v)
        }
    }
}


Читайте также:


воскресенье, 17 мая 2020 г.

Затененные (shadowed) переменные в Golang

Почему переменная n не меняется?

func main() {
    n := 0
    if true {
        n := 1
        n++
    }
    fmt.Println(n) // 0
}

Ответ

Оператор

n := 1
объявляет новую переменную, которая затеняет оригинал n во всей области действия оператора if.

Чтобы повторно использовать n из внешнего блока, вместо этого напишите

n = 1

func main() {
    n := 0
    if true {
        n = 1
        n++
    }
    fmt.Println(n) // 2
}

Обнаружение затененных переменных

Чтобы помочь обнаружить затененные переменные, вы можете использовать экспериментальную функцию -shadow, предоставляемую инструментом vet. Он помечает переменные, которые могли быть непреднамеренно скрыты. Передача оригинальной версии кода vet выдает предупреждение.

$ go vet -shadow main.go
main.go:4: declaration of "n" shadows declaration at main.go:2

С версии Go 1.12 это больше не поддерживается. Вместо этого вы можете сделать

go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
go vet -vettool=$(which shadow)

Кроме того, компилятор Go обнаруживает и запрещает некоторые случаи затенения.

func Foo() (n int, err error) {
    if true {
        err := fmt.Errorf("Invalid")
        return
    }
    return
}

../main.go:4:3: err is shadowed during return


Читайте также:


вторник, 4 июня 2019 г.

Спецификация Go: краткие объявления переменных

Краткое объявление переменной использует синтаксис:

ShortVarDecl = IdentifierList ":=" ExpressionList .

Это сокращение для объявления обычной переменной с выражениями инициализатора, но без типов:

"var" IdentifierList = ExpressionList .

i, j := 0, 10
f := func() int { return 7 }
ch := make(chan int)
r, w, _ := os.Pipe()  // os.Pipe() возвращает связанную пару Files и error (ошибку), если она есть
_, y, _ := coord(p)   // coord() возвращает три значения; заинтересованы только в y координате

В отличие от обычных объявлений переменных, краткое объявление переменных может переопределять переменные при условии, что они были первоначально объявлены ранее в том же блоке (или списках параметров, если блок является телом функции) с тем же типом и по крайней мере одна из непустых переменных является новой. Как следствие, объявление может появиться только в кратком объявлении с несколькими переменными. Переопределение не вводит новую переменную; оно просто присваивает новое значение оригиналу.

field1, offset := nextField(str, 0)
field2, offset := nextField(str, offset)  // переопределяет offset
a, a := 1, 2                              // недопустимо: двойное определение a или нет новой переменной если a была определена еще где-либо

Краткие объявления переменных могут появляться только внутри функций. В некоторых контекстах, таких как инициализаторы для операторов "if", "for", или "switch", они могут использоваться для объявления локальных временных переменных.


Читайте также: