switch case в Go

На первый взгляд, все стандартные элементы языка Go, такие как циклы или условные переходы, работают аналогично другим языкам. Однако, с операцией switch есть одна особенность, которая заключается в следующем: Если в других языках после каждого case необходимо было ставить break для того, что бы выйти из switch то в Go этого делать не нужно так как он по умолчанию выходит из case в который попал, и не проваливается в следующие. А вот для того, что бы провалиться в следующий блок case существует специальное служебное слово fallthrough. Но и на использовании fallthrough есть некоторые ограничения. В то время как break можно было указывать в любом месте блока case (не обязательно в конце или в других блоках, таких как if) fallthrough необходимо указывать только в самом конце и не вкладывать в другие блоки, в противном случае код считается не валидным.

Самостоятельная статическая линковка Go и C

Введение

В языке C процесс создания выполняемого файла проходит следующие этапы:
1. обработка препроцессором
2. Компиляция файлов в объектные файлы
3. Линковка (объединение) скомпилированных объектных файлов в исполняемый файл

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

Получение объектных файлов C

Для того, что бы получить объектный файл программы написанной на C нужно передать ее компилятору с соответствующим параметром, в случае gcc это -c

gcc -c main.c -o main.o

Получение объектных файлов Go

Для того, что бы объектный файл получить из кода написанного на го нужно к параметру build указать дополнительную опцию -buildmode=c-archive

Линкова

После того как оба файла будут готовы остается их слинковать тем же ggc

gcc main.o test.a -pthread -o main

Примечание

Любая программа на го имеет в себе некоторый оверхед в виде сборщика мусора и других полезных вещей, некоторые из них работают в отдельном потоке. По этому, для того, что бы слинковать файлы среди которых есть объектные файлы полученные из исходников программы на Go необходимо включить объектные файлы реализующие функционал работы с потоками. Именно по этому нужно так же добавить параметр -pthread

Пример

Разница между массивом и слайсом в Go

Введение

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

Слайс — это структура которая используется для работы с набором данных вместо массива. Слайс является структурой строго фиксированного размера так как содержит в себе указатель на сам массив а так же норма первого элемента и длину. Таким образом, если слайс не является срезом всего массива на который он ссылается, то можно сказать, что он имеет какое то количество зарезервированного места для добавления других элементов. В случае если все ячейки массива используются и добавлять новые элементы некуда функция append() сама выделит место под новый массив в два раза больше того что есть сейчас и скопирует туда все элементы, плюс добавит новые на которые до этого места не хватало, после этого еще несколько элементов будут добавлены без дополнительных затрат ресурсов пока есть зарезервированное место в новом массиве.

Объявление

разница объявления массивов и слайсов заключается только в том, что в случае слайса в квадратных скобках не указывается длина слайса

Примечание

  • функция append() всегда работает только со слайсами
  • разные слайсы могут ссылаться на один и тот же массив, что может привести к изменению элементов в двух слайсах одновременно при попытке изменить элемент только в одном
  • Так как в Go все передаваемое в функцию копируется, то копируется и сама структура слайса, но из за того, что сам слайс не хранит данных а только ссылается на массив с данными, получается что передача слайса происходит по ссылке так как этот слайс содержит ссылку