LINUX.ORG.RU

go переменные

 


0

5

Читаю про Go.

Поиск в Google выдает:
«В Go тип переменной ставится после имени из-за стремления к лаконичности и читаемости кода, а также для упрощения процесса вывода типов компилятором (синтаксис имя тип вместо тип имя), что делает код более понятным»

«Понятнее» конечно делает, если тип функции засунуть между аргументами функции и телом функции:

func CalculateDiscount(price float64, percentage float64) float64 {

Go поощряет использование коротких имен, особенно в случаях, когда их смысл легко понять из контекста.
Пример с habr.com (два варианта):

func countLines() int {
    // do stuff
    var linesCount int
    for i := 0; i < lines; i++ {
        linesCount += 1
    }
    return linesCount
}

func countLines() int {
    // do stuff
    var c int
    for i := 0; i < lines; i++ {
        c += 1
    }
    return c
}

★★

Последнее исправление: WinLin2 (всего исправлений: 5)
Ответ на: комментарий от LongLiveUbuntu

Массив указателей на функции, очевидно. *name[] это всегда массив указателей. Не путать с (*name)[] - это указатель на массив, тут звёздочка главнее (скобками придвинута к имени), а значит name в первую очередь указатель а дальше за скобками узнаётся на что именно.

Если бы ты хоть раз писал парсер сишных типов, понял бы что правила там вполне тривиальные и очевидные: то что справа смотрится раньше чем то что слева, порядок рассмотрения можно менять скобками.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от anonymous

а почему в жаве «пустую переменную» можно объявить как int linesCount и оно потом потребует чтобы значение присвоили, без всякой дичи с var? тут понятно, что в целом это дело исключительно привычки, но это не умаляет всратости синтаксиса.

borisych ★★★★★
()
Последнее исправление: borisych (всего исправлений: 1)
Ответ на: комментарий от borisych

дело исключительно привычки

но это не умаляет всратости синтаксиса

По мне так в Яве всратость.

В Go если переменна объявлена через var понятно, что она изначально пустая. А если нужно забиндить значение – := Можно ещё, конечно, изобразить var xs map[int]string = make(map[int]string) вместо xs := make(map[int]string), но зачем.

anonymous
()
Ответ на: комментарий от anonymous

А если нужно забиндить значение – :=

могу еще набор полезных операторов предложить:

8=o - писал джун, 8===o - нетленка сеньора, {0} - уничтожить после выхода из скоупа, (_._) - strong reference, (_0_) - weak reference

borisych ★★★★★
()
Ответ на: комментарий от anonymous

В Go если переменна объявлена через var понятно, что она изначально пустая. А если нужно забиндить значение – :=

в каком месте это «забиндить» происходит-то?

    var linesCount int
    for i := 0; i < lines; i++ {
        linesCount += 1
    }

вот пишем на жаве:

    int linesCount;
    for (int i = 0; i < 1000; i++) {
        linesCount += 1;
    }

оно говорит:

java: variable linesCount might not have been initialized

а в GO мы имеем то что имеем: где-то нужно писать так, а где-то вовсем иначе.

borisych ★★★★★
()
Ответ на: комментарий от firkax

блин будь * и [] однофиксны то скобки не нужны

ибо для пре было б
*[]name массив указателей vs []*name указатель на массив

ибо для пост было б
name[]* массив указателей vs name*[] указатель на массив

но в этом адке выбор между *name[] vs (*name)[] по забавным причинам не достаточной привычности(на начало 1970ых) в косвенные косвенности и даже желания избегать двойные косвенности удорожанием синтаксиса таковых конструкций

[upd] и более того костыльности int n[] как декларации (наряду с выделением памяти в случае n[literalInt]) и int[n] Ж)

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 2)
Ответ на: комментарий от firkax

настолько тривиальные что во втором издании Сяшки был подраздел главы алгоритмизирующий парсинг крокодила деклараций

по факту сяшка это строчно-ориентированный ассемблер :)

qulinxao3 ★☆
()
Ответ на: комментарий от ugoday

Go сразу стал бы годным языком? А если нет, к чему эта придирка?

ладно, сдаюсь, как в GO правильно писать for loop по int64? так:

func countLines() int {
    // do stuff
    var linesCount int
    var lines int64 = 1000000000000000000
    var i int64 = 0;
    for ; i < lines; i++ {
        linesCount += 1
    }
    return linesCount
}
borisych ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Начни тогда с борьбы с школьной арифметикой - там тоже порядок действий можно скобками менять, и наверно это можно считать первопричиной использования скобок как во всей последующей математике по всему миру, так и в разных аспектах программирования.

firkax ★★★★★
()
Ответ на: комментарий от qulinxao3

С этим частично можно согласиться, однако:

Если всё сделать префиксным - непонятно как в эту конструкцию вписать аргументы функции, что-то типа int (int arg) funcname выглядит нелепо. Да и int [5] var тоже не особо норм. Хотя, может быть, это опрос привычки и если б я сразу такое увидел - было бы всё норм. Ещё надо вспомнить, что в имевшемся раньше Фортране размерности массивов тоже были справа (а указателей не было вообще), и наверно тоже не хотели это ломать.

Если всё сделать постфиксным - то тайпкасты будут записываться неочевидно. Сейчас тайпкасты к указателями выглядят нормально, а вот тайпкаст к массиву или фукнции - не очень, благо они обычно и не нужны. А так будет и с указателем сложно, а он уже нужен очень часто.

firkax ★★★★★
()