Go : философия ("фишки Go")

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : философия ("фишки Go")

Непрочитанное сообщение Olej » 12 фев 2022, 18:49

Здесь вот - Go (продолжение) - был перевод статьи одного из авторов Go, известнейшего Роба Пайка, о том, что философия Go принципиально отличается, и даже противоречит C и C++... И о том, что программисты с Python & Ruby гораздо проще адаптируются в Go, чем программисты с C и C++. :lol:
• регулярный синтаксис (для разбора не нужна таблица символов);
• сборка мусора (исключительно);
• отсутствие заголовочных файлов;
• явные зависимости;
• отсутсвие циклических зависимостей;
• константы - это просто числа;
• int и int32 — это разные типы;
• регистр букв имён устанавливает видимость;
• методы для любого типа (без классов);
• без наследования подтипов (без подклассов);
• инициализация на уровне пакета и строго определенный порядок инициализации;
• файлы компилируемые вместе в пакет;
• глобальные переменные уровня пакета представлены в любом порядке;
• никаких арифметических преобразований (помогают константы);
• интерфейсы являются неявными (без объявления «реализует»);
• встраивание (без повышения до суперкласса);
• методы объявляются как функции (без специальной локализации);
• методы - это просто функции;
• интерфейсы - это просто методы (без данных);
• методы отождествляются только по имени (не по типу);
• без конструкторов и деструкторов;
• постинкремент и постдекремент - это операторы, а не выражения;
• нет преинкремента или преддекремента;
• присваивание не является выражением;
• определен порядок вычислений в присвоениях, функциональных вызовах (без «точек следования», известных из C/C++1);
• нет арифметики указателей;
• память всегда обнуляется;
• допустимо брать адрес локальной переменной;
• нет указателя this в методах;
• сегментированные стеки;
• нет const или других типов аннотаций;
• нет шаблонов;
• нет исключительных ситуаций;
• встроенный тип строк, срезы, ассоциативные хэши;
• проверка границ массива;
Вот подборку информации про такие принципиальные механизмы Go, да ещё желательно от участвовавших в создании Go, я хочу себе здесь собрать... С толкованиями в примерах кода.

P.S. Т.е. здесь тема об "изюминках" Go ;-)


Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : философия ("фишки Go")

Непрочитанное сообщение Olej » 10 май 2022, 11:36

Olej писал(а):
25 апр 2022, 15:17
Совсем недавно вышла новая версия GoLang.
Olej писал(а):
25 апр 2022, 21:01
А вот очень неплохое перечисление существенных новинок Go - Релиз Go 1.18:
Пожалуй, самое важное дополнение в 1.18, о котором давно спорили, обсуждали и просили - это дженерики.
Но прежде чем смотреть что там понаделали, нужно установить из исходников версию 1.8 (или больше), потому что в бинарном-пакетном виде и в репозиториях дистрибутивов этой версии ещё нет.
См. установку: Go : инструментарий (продолжение)

Код: Выделить всё

olej@R420:~/2022/ACCOUNTS$ go version
go version go1.16.2 linux/amd64

Код: Выделить всё

olej@R420:~/2022/ACCOUNTS$ update-alternatives --display go
go - ручной режим
  link best version is /home/olej/goroot/bin/go
  ссылка сейчас указывает на /lib/go-1.16/bin/go
  link go is /usr/bin/go
/home/olej/goroot/bin/go — приоритет 80
/lib/go-1.13/bin/go — приоритет 60
/lib/go-1.16/bin/go — приоритет 70
И переключаемся:

Код: Выделить всё

olej@R420:~/2022/ACCOUNTS$ sudo update-alternatives --config go
[sudo] пароль для olej:
Есть 3 варианта для альтернативы go (предоставляет /usr/bin/go).

  Выбор   Путь                  Приор Состояние
------------------------------------------------------------
  0            /home/olej/goroot/bin/go   80        автоматический режим
  1            /home/olej/goroot/bin/go   80        ручной режим
  2            /lib/go-1.13/bin/go        60        ручной режим
* 3            /lib/go-1.16/bin/go        70        ручной режим

Press <enter> to keep the current choice[*], or type selection number: 0
update-alternatives: используется /home/olej/goroot/bin/go для предоставления /usr/bin/go (go) в автоматическом режиме

Код: Выделить всё

olej@R420:~/2022/ACCOUNTS$ go version
go version devel go1.19-fd6c556dc8 Sat Apr 30 04:04:40 2022 +0000 linux/amd64

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : философия ("фишки Go")

Непрочитанное сообщение Olej » 10 май 2022, 11:40

Olej писал(а):
10 май 2022, 11:36
Пожалуй, самое важное дополнение в 1.18, о котором давно спорили, обсуждали и просили - это дженерики.
Введение в использование дженериков в Golang
понедельник, 2 мая 2022 г.
В релизе Go 1.18 добавлена поддержка дженериков. Дженерики — это самое большое изменение, которое было внесено в Go с момента первого релиза с открытым исходным кодом. В этом посте вы познакомитесь с новыми функциями языка. Мы не будем пытаться охватить все детали, но затронем все важные моменты.

Дженерики — это способ написания кода, который не зависит от используемых конкретных типов. Функции и типы теперь могут быть написаны для использования любого набора типов.
Дженерики добавляют в язык три новых важных вещи:
- Параметры типа для функции и типов.
- Определение типов интерфейсов как наборов типов, включая типы, не имеющие методов.
- Вывод типа, позволяющий во многих случаях опускать аргументы типа при вызове функции.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : философия ("фишки Go")

Непрочитанное сообщение Olej » 10 май 2022, 14:56

Olej писал(а):
10 май 2022, 11:36
Пожалуй, самое важное дополнение в 1.18, о котором давно спорили, обсуждали и просили - это дженерики.
Но для того чтобы вернуться с опытами с дженериками нужно рассмотреть модули которые появились с версии 1.11 (конец 2018 г.?).
Введение в систему модулей Go
27 августа 2018
Грядущий релиз версии 1.11 языка программирования Go принесет экспериментальную поддержку модулей — новую систему управления зависимостями для Go. (прим.перев.: релиз состоялся)
Первым делом создадим наш пакет. Назовём его "testmod". Важная деталь: каталог пакета следует разместить за пределами вашего $GOPATH, потому что, внутри него по умолчанию отключена поддержка модулей. Модули Go — это первый шаг к полному отказу в будущем от $GOPATH.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : философия ("фишки Go")

Непрочитанное сообщение Olej » 10 май 2022, 23:14

Olej писал(а):
10 май 2022, 14:56
Но для того чтобы вернуться с опытами с дженериками нужно рассмотреть модули
Как писать Go код (с использованием модулей)
21 марта 2021 г.
В этом посте предполагается, что вы используете Go 1.13 или новее
...
Программы Go организованы в пакеты. Пакет - это набор исходных файлов в одном каталоге, которые скомпилированы вместе. Функции, типы, переменные и константы, определенные в одном исходном файле, видны всем другим исходным файлам в том же пакете.

Репозиторий содержит один или несколько модулей. Модуль - это набор связанных пакетов Go, которые выпускаются вместе. Репозиторий Go обычно содержит только один модуль, расположенный в корне репозитория. Файл с именем go.mod объявляет путь к модулю: префикс пути импорта для всех пакетов в модуле. Модуль содержит пакеты в каталоге, содержащем его файл go.mod, а также подкаталоги этого каталога до следующего подкаталога, содержащего другой файл go.mod (если есть).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : философия ("фишки Go")

Непрочитанное сообщение Olej » 10 май 2022, 23:46

Olej писал(а):
10 май 2022, 11:40
Введение в использование дженериков в Golang
Простейший пример дженериков можно организовать так...
Смотрим и делаем:

Код: Выделить всё

olej@R420:~/go/src$ go env GOPATH
/home/olej/go

olej@R420:~/go/src$ mkdir `go env GOPATH`/src/gener

olej@R420:~/go/src/gener$ pwd
/home/olej/go/src/gener
Делаем исходный файл:

Код: Выделить всё

olej@R420:~/go/src/gener$ cat gener.go 
package main

import "golang.org/x/exp/constraints"

func GMin[T constraints.Ordered](x, y T) T {
    if x < y { return x }
    return y
}

func main() {
	println(GMin[int](2, 3))
	println(GMin[float64](2, 3))
	println(GMin[string]("один", "два"))
}
Но этого мало...

Код: Выделить всё

olej@R420:~/Monero$ go install golang.org/x/exp/constraints@latest
go: downloading golang.org/x/exp v0.0.0-20220428152302-39d4317da171
package golang.org/x/exp/constraints is not a main package

Код: Выделить всё

olej@R420:~/go/src/gener$ go mod init 
go: creating new go.mod: module gener
go: to add module requirements and sums:
	go mod tidy

Код: Выделить всё

olej@R420:~/go/src/gener$ go mod tidy
go: finding module for package golang.org/x/exp/constraints
go: found golang.org/x/exp/constraints in golang.org/x/exp v0.0.0-20220428152302-39d4317da171

Код: Выделить всё

olej@R420:~/go/src/gener$ cat go.mod
module gener

go 1.19

require golang.org/x/exp v0.0.0-20220428152302-39d4317da171
Сборка:

Код: Выделить всё

olej@R420:~/go/src/gener$ go build

olej@R420:~/go/src/gener$ ls
gener  gener.go  go.mod  go.sum
Можно выполнять:

Код: Выделить всё

olej@R420:~/go/src/gener$ ./gener 
2
+2.000000e+000
два
Вложения
gener.go
(258 байт) 40 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : философия ("фишки Go")

Непрочитанное сообщение Olej » 11 май 2022, 00:08

Olej писал(а):
10 май 2022, 14:56
Но для того чтобы вернуться с опытами с дженериками нужно рассмотреть модули

Код: Выделить всё

olej@R420:~/go/src$ go env GOPATH
/home/olej/go

olej@R420:~/go/src/testmod$ pwd
/home/olej/go/src/testmod

Код: Выделить всё

olej@R420:~/2022/Go/news/testmod$ go mod init github.com/Olej-Tsil/testmod
go: creating new go.mod: module github.com/Olej-Tsil/testmod
go: to add module requirements and sums:
    go mod tidy

olej@R420:~/2022/Go/news/testmod$ go mod tidy -v

Код: Выделить всё

olej@R420:~/2022/Go/news/testmod$ ls -l
итого 12
-rw-rw-r-- 1 olej olej  45 мая 10 15:39 go.mod
-rw-rw-r-- 1 olej olej 136 мая 10 14:52 testmod.go
-rw-rw-r-- 1 olej olej  23 мая 10 14:52 testmod.hist

Код: Выделить всё

olej@R420:~/2022/Go/news/testmod$ git init
Инициализирован пустой репозиторий Git в /home/olej/2022/Go/news/testmod/.git/

olej@R420:~/2022/Go/news/testmod$ git add *

Код: Выделить всё

olej@R420:~/2022/Go/news/testmod$ git commit -am "my first Go commit"
[master (корневой коммит) 2fcdd10] my first Go commit
 3 files changed, 14 insertions(+)
 create mode 100644 go.mod
 create mode 100644 testmod.go
 create mode 100644 testmod.hist

Код: Выделить всё

olej@R420:~/2022/Go/news/testmod$ git branch
* master

Код: Выделить всё

olej@R420:~/2022/Go/news/testmod$ git log
commit 2fcdd10c44130ef0765f0d99ab60071cea0ed69d (HEAD -> master)
Author: Oleg Tsiliuric <olej.tsil@gmail.com>
Date:   Tue May 10 15:49:18 2022 +0300

    my first Go commit

Код: Выделить всё

olej@R420:~/go/src/testmod$ tree
.
├── go.mod
├── testmod.go
└── testmod.hist

0 directories, 3 files

Код: Выделить всё

olej@R420:~/go/src/testmod$ tree -a
.
├── .git
│   ├── branches
│   ├── COMMIT_EDITMSG
│   ├── config
│   ├── description
│   ├── FETCH_HEAD
│   ├── HEAD
│   ├── hooks
│   │   ├── applypatch-msg.sample
│   │   ├── commit-msg.sample
│   │   ├── fsmonitor-watchman.sample
│   │   ├── post-update.sample
│   │   ├── pre-applypatch.sample
│   │   ├── pre-commit.sample
│   │   ├── pre-merge-commit.sample
│   │   ├── prepare-commit-msg.sample
│   │   ├── pre-push.sample
│   │   ├── pre-rebase.sample
│   │   ├── pre-receive.sample
│   │   └── update.sample
│   ├── index
│   ├── info
│   │   └── exclude
│   ├── logs
│   │   ├── HEAD
│   │   └── refs
│   │       └── heads
│   │           └── main
│   ├── objects
│   │   ├── 2f
│   │   │   ├── 7c67f846b4aa86b84e59436adebeb5d968eb5d
│   │   │   └── cdd10c44130ef0765f0d99ab60071cea0ed69d
│   │   ├── 9b
│   │   │   └── 05f1ded158e9a57b52c0b1c5d5a52542058b02
│   │   ├── a2
│   │   │   └── 4f9b9505cd155d4e26afb468477a0f9ed014b1
│   │   ├── de
│   │   │   └── d4fae52a85f31b75e45fbd01f29a4cada15f02
│   │   ├── info
│   │   └── pack
│   └── refs
│       ├── heads
│       │   └── main
│       └── tags
├── go.mod
├── testmod.go
└── testmod.hist

17 directories, 30 files
Вложения
testmod.go
(136 байт) 40 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : философия ("фишки Go")

Непрочитанное сообщение Olej » 11 май 2022, 23:45

Ещё о дженериках попутно: Дженерики могут замедлить ваш код на Go
9 апреля в 23:52
Перевод
Автор оригинала: Vicent Marti
Встречайте, вот и Go 1.18, а с ней – первый релиз долгожданной реализации дженериков, наконец-то готовых к реальному использованию в продакшене. Дженерики – это весьма востребованная возможность, давно вызывающая жаркие споры в сообществе Go. С одной стороны, самые голосистые беспокоятся по поводу сложности, которую привносят дженерики. Их страшит неизбежная эволюция Go, которая доведет его либо до многословия как в энтерпрайз-версии Java, со своими обобщенными фабриками, либо, самое страшное, превратит Go в вырожденный HaskellScript, где if-ы придется заменить монадами. Положа руку на сердце, оба этих опасения могут быть преувеличенными.
...
Выводы
Получилось очень интересно! Надеюсь, вы также получили массу удовольствия, разбираясь вместе со мной во всех этих сборках. Давайте же завершим этот пост кратким списком НАДО и НЕ НАДО, касающихся производительности и дженериков в Go 1.18:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : философия ("фишки Go")

Непрочитанное сообщение Olej » 05 янв 2023, 09:45

Olej писал(а):
12 фев 2022, 18:49
здесь тема об "изюминках" Go
Подсказали в одном из Telegram чатов (https://t.me/gogolang/782864):

Код: Выделить всё

package main

import "fmt"

func main() {
	m := map[int]int{
		1: 10,
		2: 11,
		3: 53,
		4: 23,
		5: 543,
		6: 513,
	}
	for i := 0; i < 3; i++ {
		for key, value := range m {
			fmt.Printf("%1d:%d\t", key, value)
		}
		println()
	}
}

Код: Выделить всё

olej@R420:~/2023/Go/types$ go fmt map3rand.go 
map3rand.go

Код: Выделить всё

olej@R420:~/2023/Go/types$ go build map3rand.go

Код: Выделить всё

olej@R420:~/2023/Go/types$ ./map3rand 
6:513	1:10	2:11	3:53	4:23	5:543	
1:10	2:11	3:53	4:23	5:543	6:513	
4:23	5:543	6:513	1:10	2:11	3:53	

Код: Выделить всё

olej@R420:~/2023/Go/types$ ./map3rand 
1:10	2:11	3:53	4:23	5:543	6:513	
1:10	2:11	3:53	4:23	5:543	6:513	
5:543	6:513	1:10	2:11	3:53	4:23	

Код: Выделить всё

olej@R420:~/2023/Go/types$ ./map3rand 
5:543	6:513	1:10	2:11	3:53	4:23	
4:23	5:543	6:513	1:10	2:11	3:53	
5:543	6:513	1:10	2:11	3:53	4:23	
Итак...
Отображение (map) меняет порядок перечисления (выборки) не только от прогона к прогону программы, но даже при последовательных вызовах в одном фрагменте кода!
Вложения
map3rand.go
(235 байт) 26 скачиваний

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей