Comments 15
Прикольная статья, мне понравилась. Особенно про то как работать с системными вызовами и С из голанга
В самом начале:
Компилятор сам расставляет отступы с помощью gofmt. Но важно использовать табуляцию.
И далее примеры по тексту:
func main() {
str := "Hello, World\n"
cs := C.CString(str)
C.fputs(cs, (*C.FILE) (C.stdout))
C.free(unsafe.Pointer(cs))
}
Коллеги, мы не компиляторы golang`а - нам бы в примерах сразу нормальное форматирование. :) Поправьте, пожалуйста.
Язык ядра Linux, его модулей и утилит написаны на языке C
Простите, но глаза ломаются и дёргаются, когда с первой строки язык ядра написан на языке С )
Параллельные процессоры и fork
Вы меня извините опять, но я не смог представить параллельные процессоры. Попытался представить ортогональные и положить угол равным нулю, но не помогло)
Ожидал увидеть что-то более реальное, типа "для примера возьмем исходники программы $NAME, для наглядности напишем свою обертку, где выставим нужные нам параметры" и т.п.
Я конечно могу найти что-то вроде https://github.com/google/brotli , поковырять, попытаться понять как это устроено и работает, но всё же... Как то не хватает в статье более-менее реальных примеров, а то на самом интересном всё и закончилось. Я даже думал где-то в конце должна быть рекламная ссылка на курсы.
Я от природы очень глупый, но понял, что
Go - замечательный язык программирования
В Телеграм ему посвящены один замечательный и ещё 17 просто очень хороших каналов
Маскотом Go (до этой статьи никогда не задумывался) является суслик (Gopher) что весьма изящно перекликается с Gofer или даже дальше, с Golfer
А теперь чего я по глупости не понял, занятым умникам рекомендую не читать - не будет повода гадить в карму
При чём тут Пингвин, не верю что Go не под Линукс работает иначе
При чём тут системное программирование, не верю что системное программирование тождественно возможности взаимодействовать с С и ассемблером
Не верю что в системном программировании допустима нестабильность по времени вызванная сборщиком мусора, да и двоечка в минус по производительности показанная моим примитивным нерепрезентативным тестом - тоже не к месту
Не верю что в системном программировании допустима способность языка из-под тишка плодить артефакты уровня ОС как это делают горутины с ветками
При чём тут fork если тут же рядом сказано - все горутины работают в одном адресном пространстве
Статья не упоминающая недостатки вовсе заставляет полагать что любой недостаток имеет уровень deal breaker, например, навязанная многословная и разрушающая связность кода обработка ошибок провоцирующая желание на неё забить, то есть дающая обратныйй задуманному эффект, это по слухам
Так и не понял как работают горутины, посмотрел доки, об этом ниже
Корутины, горутины, сопрограммы — все это синонимы ветвей в Go. Так что не путайтесь, если я буду их использовать.
В доках написано, что термин горутины введён, на первый взгляд супртив бритвы Оккама, потому, что все остальные варианты имеют вводящие в заблуждение коннотации. Так что буду пугаться.
Go дает возможность создать новую ветвь (поток) выполнения программы (goroutine, go-процедуру) с помощью выражения go.
В доках написано что новая ветвь (thread, и умоляю автора приводить термины в гуглящейся форме) создаётся когда горутина блокирует выполнение, а не выражением go.
Первый же пример горутины в доках https://go.dev/tour/concurrency/1 показался странноватым, как потыкал в него, так он принял вид
package main
import (
"fmt"
"time"
)
func say(s string, delay time.Duration, c chan int) {
for i := 0; i < 5; i++ {
time.Sleep(delay)
fmt.Println(s)
}
//close(c) //Deadlock if omitted, requires a channel per call
c <- 1
}
func main() {
c := make(chan int,3) // without this just exits cleanly(!!!) saying nothing
//d := make(chan int,3)
go say("world", 150 * time.Millisecond, c)
go say("hello", 100 * time.Millisecond, c) //d)
u := 0
for i := range c {
u = u+1 // := instead of = is stealthy and deadly
if u == 2 { // requires global knowledge about all the goroutines run
close(c)
}
}
//for i := range d {
// fmt.Println(i)
//}
}
от которого просто разит Гуглом.
Если у вас остались вопросы
Не вопросы, а нестыковки. Их так много, что разбор потянет на целую статью.
Автоформатирование кода. Компилятор сам расставляет отступы с помощью gofmt. Но важно использовать табуляцию.
Автоформатирование есть для любого уважающего себя языка. Просто в Go оно «в комплекте». Компилятор не расставляет отступы. Табуляция будет независимо от вашей воли.
Если вы не хотите заморачиваться над созданием документации — можно использовать godoc.
Не, тут другой посыл - механизм документации уже «в комплекте», заморачиваться и не придётся.
Низкоуровневое программирование — да-да, Go все таки может работать непосредственно с памятью, и существует пакет unsafe .
Пакет существует, но это не повод его сразу применять. Его использование снижает безопасность, надёжность, переносимость и поддерживаемость программ.
Корутины, горутины, сопрограммы — все это синонимы ветвей в Go. Так что не путайтесь, если я буду их использовать.
Реально запутался;) Зачем по-разному называть, если уже есть один устоявшийся термин?
В каждом дистрибутиве линукса есть огромное количество библиотек для Go.
Но зачем? О чём вообще речь? Зачем брать библиотеки из дистрибутива, если в Go свой прекрасный менеджер пакетов? И чаще всего Go-код компилируется в самодостаточный бинарь. Даже сам Go легко ставится и обновляется путём распаковки архива. Не в каждом дистрибутиве запакечен свежий Go.
Кроссплатформеность — поддержка Go осуществляется для Linux, Windows, MacOS и даже Free и Open BSD систем
Вот тут обидно, не докрутили. Самое то главное - кросс-компиляция, когда на одной системе можно собирать под много разных других платформ.
Язык специально сделан так, чтобы сфокусировать внимание разработчика на архитектуре приложений,
Точно в яблочко! Но это плохо согласуется с приёмами из статьи, вся эта возня с Cgo и ассемблерными вставками. К примеру, работать с SQLite можно и через либу с C-биндингами и через нативный драйвер. Так вот, я предпочту драйвер без Cgo, потому что мне важна кросс-компиляция и не хочется зависеть от C-компилятора и его тулчейна. Всё же Go это больше про прикладное программирование.
Я бы только не забывал добавлять, что с подключением кусков на С можно забыть про фантастически быструю компиляцию Golang.
Еще одной отличительной способностью Go является быстрота исполнения программы — чаще всего даже быстрее языка C
Тот случай, когда одним голословным и очень сомнительным утверждением портят впечатление обо всей статье. Подтверждающие ссылки привести сможете?
Интересно, Горутины в Голанг называются "параллельными" сопрограммами. В Питоне программирование Корутин называется "асинхронным". Часто на собеседованиях по Python задается вопрос - отличия threading / multiprocessing / asyncio. Да, до последней версии Python выполняется на одном ядре.
Нельзя ли назвать Горутины в Golang "параллельно-асинхронными"? Поскольку 1) в Golang есть возможность выполнять на нескольких ядрах 2) как в питоне, во время простаивания (например, во время ожидания ответов сетевых запросов) Горутины отдают выполнение в Loop.
Спасибо за статью! Я периодически пишу на Go, но чаще всё-таки на C. Была как-то идея гошный код в .so собрать и к сишке подключить, но побоялся, не хотелось гошную асинхронщину с сишной смешивать. Был ли у кого-то опыт CGO "в обратную сторону", можете поделиться?)
Мы как-то ради однообразия решили написать на Го модуль so-шку для PAM. Ничего асинхронного там не было, только файлик прочесть и найти юзера, но в so добавляется гошная стандартная либа и размер получается несоизмеримый. Переписали на другой язык, вместо пары мегабайт вышло несколько килобайт, на этом "cgo в обратную сторону" закончилось ;)
Суслик и пингвин: кодим на Go под Linux