LINUX.ORG.RU

Go для нативной разработки

 , , ,


0

3

Долгое время по поверхностному знакомству я считал Go языком для ниши C#/Java — жирноватая, но не скриптовая, хрень, заточенная под прикладную разработку, но не рассчитанная на максимальную производительность в ущерб удобству разработки. То есть в нише нативных языков, таких как C/C++/Rust, сабжу делать нечего. Поковырявшись в вопросе, я убедился, что оно недалеко от истины: хоть Go и компилируется в нативный исполняемый файл, но кладёт туда жирный рантайм и линкует всё статически, в итоге даже хэллоуворлд весит полтора мегабайта — это больше, чем на хаскелле! И несмотря на это, я нередко встречаю утверждения, что Go и для ниши нативных языков хорош. А где истории успеха, собственно?

Блин, ну 1.5 Мб это очень достойно и не много. Копейки по современным меркам, на уровне D. А, вот, хелловорлд на свифте, к примеру, статически линкуется в 8 Мбайт. Т.ч. размер не столь важен, да и Go явно не проигрывает в этом плане.

Истории успеха - это Docker прежде всего. На Go многие компании ринулись писать микро бекенды. И вполне ниче. Не намного круче node.js, но зато ресурсы жрёт меньше, а отдачи больше. Но разработка, да, гораздо сложнее, сам по себе язык Go не особо «приятный», да и все эти отловы ошибок, работа с кастование типов на каждый чих - то ещё удовольствие.

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

Зависит от твоих возможностей и твоего окружения.

menangen ★★★★★
()

даже хэллоуворлд весит полтора мегабайта

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

Dred ★★★★★
()

Лично я на нем пишу всякие импортеры тарифов в базу, интерфейсы между программными продуктами - быстро, шустро. Если собрать с -ldflags="-s", а потом сверху пройтись upx то и размер не кусается.

CynicRus
()

Если ты внезапно не начал писать на Go, то твоё знакомство так и осталось поверхностным.

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

dmd

Блин, ну 1.5 Мб это очень достойно и не много. Копейки по современным меркам, на уровне D.

Глянул сейчас D — 716Кб. После strip'a — 504Кб.

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

Наверное.

$ cat test.go
package main

import "fmt"

func main() {
	fmt.Println("Hello LOR!")
}
$ go build -o test test.go
$ strip test
$ du test
1192	test
$ go build -compiler gccgo -o test.gcc test.go
$ strip test.gcc
$ du test.gcc
24	test.gcc
$ time ./test                                                                                        
Hello LOR!
./test  0,00s user 0,00s system 94% cpu 0,003 total
$ time ./test.gcc
Hello LOR!
./test.gcc  0,08s user 0,01s system 99% cpu 0,089 total
$ ldd test 
	не является динамическим исполняемым файлом
$ ldd test.gcc
	linux-vdso.so.1 (0x00007ffeb91fd000)
	libgo.so.11 => /usr/lib/libgo.so.11 (0x00007f0c0fe45000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007f0c0faf9000)
	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f0c0f8e2000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007f0c0f52b000)
	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f0c11ba9000)
	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f0c0f30d000)
Difrex ★★★★
()
Последнее исправление: Difrex (всего исправлений: 1)

На дискету не влазит?

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

внезапно не начал писать на Go

А есть хоть малейшая мотивация кроме живительных пенделей от хипсторов, пробравшихся в начальство? Как то вариант писать на C не кажется таким уж страшным при взгляде на это го. Или можно даже упороться ерлангом если действительно нужны мульёны гринтредов.

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

библиотека отвечающая за вывод

Ну вотще, а если приложение, например, чисто графическое, или всё его текстовое взаимодействие с пользователем заключается в выводе готовой справки — нафиг она там упёрлась?

bodqhrohro_promo
() автор топика

У меня сейчас проект в околоэмбеде на го будет делаться. Относительную жырноту рантайма компенсирует относительная простота написания кода, батарейки и наличие людей которых можно будет на это подписать если что, в отличие от раста.

А заменой C#/Java Go не станет пока не переделают систему типов и не добавят нормальную обработку ошибок. Первое - для структурирования проекта, второе для того чтобы не писать на каждый чих «if err != nil». В этом плане даже rust с его Result<T,Error> гораздо удобнее.

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

Сырое же ещё. Через некоторое время может быть и.

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

Результат быстрее чем на сишечке. Плюс меньше шансов на то, что память потечёт не туда.

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

скорее всего с символами, но без обладочной информации.

Dark_SavanT ★★★★★
()

А где истории успеха, собственно?

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

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

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

драматически. upx сжимает нестрипанный goшный выхлоп на 60-80%

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

хейтеры - хейтят. поверхностные, глупые люди.

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

Компилируй gccgo. Будет тебе размер как в С, если для тебя это важно.

два чая с мятой этому котану

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

внезапно не начал писать на Go

А есть хоть малейшая мотивация кроме живительных пенделей от хипсторов, пробравшихся в начальство?

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

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

два чая с мятой этому котану

смузи с капкейками этому няше-анонимусу

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

Как то вариант писать на C не кажется таким уж страшным при взгляде на это го

В сях зато Each нету :P

В сях есть всё, надо только это запилить. Так что пилите, Шура, пилите и не надо тут.

Virtuos86 ★★★★★
()

в итоге даже хэллоуворлд весит полтора мегабайта

package main

func main() {
        println("hi there")
}
981K Mar  3 15:46 hello
614K Mar 27 16:50 hello.stripped

Go 1.10 ЧЯДНТ ?

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

но такому горе-админу локалхоста, как я, он не нужен

ну и зря.. полуркай «go run» и узришь дополнительные возможности для командной строки

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

Неплохой прогресс, позовёшь, когда хотя бы 100 кБ будет.

bodqhrohro_promo
() автор топика

А где истории успеха, собственно?

Kubernetes, Docker, Consul, Packer, Vault, Nomad, Terraform, Prometheus, Influx TICK stack это первое что пришло в голову.

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

Кто все эти люди? Как минимум докер — жирная НЁХ с громадными образами ФС, которые спасает только спарс. Бинари там тоже печальные. Зато не так жирно, как виртуалки, вот это перемога.

bodqhrohro_promo
() автор топика
Ответ на: комментарий от robot12

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

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

Лозунги вы вбрасываете правильные, но к реальности они не имеют никакого отношения.

ugoday ★★★★★
()

В добавок к -s и upx можно пройтись по стандартной библиотеке и заменить строки ошибок на коды ошибок. Ну например, пакет bufio

 var (                                                                                                                                                         
          ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte")
          ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune")
          ErrBufferFull        = errors.New("bufio: buffer full")
          ErrNegativeCount     = errors.New("bufio: negative count")
  )

Заменить на что-то типа [номер_пакета:номер_ошибки] ErrBufferFull = errors.New(«27:15»). Или даже еще дешевле юзать float -> errors.New(27.15) Строки в utf8 весят много. Но вообще Go и эмбедед не очень совместимы, вангую ты хочешь малварь на Go писать.

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

Это же жырный читинг. Все нынче вызывают функцию println из пакета fmt. вот так fmt.Println(), а в твоем случае идет вызов устаревшей функции, которую роб пук оставил, чтобы можно было хелло ворды делать, и возможно выпилят ее. На самом деле на 32х линукс системе хелловорд весит 1.6mb, если собирать с флагом -s, то 1.1mb

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

Это же жирный читинг, все нынче на электроне пишут, тут никак меньше сотни мегабайт быть не может, а ты в пару мегабайт запихнул гуёвое прикладное приложение — еретикъ! луддит! ретроград! на костёр! да как посмел! кто тебе разрешил в 2!18 на пне работать, ану быстро на помойку выкинул!

bodqhrohro_promo
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.