Pull to refresh

Comments 15

Прикольная статья, мне понравилась. Особенно про то как работать с системными вызовами и С из голанга

В самом начале:

  1. Компилятор сам расставляет отступы с помощью 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 в обратную сторону" закончилось ;)

а "на другой" - это на какой? Если не секрет

Sign up to leave a comment.

Articles