Потребовалось мне для работы развернуть под WSL qemu для arm с отладкой и т.п. А оно давай требовать либы армовские, и далее по нарастающей. В общем вдавил я по тормозам и пошел гуглить. Результат чего вам тут и предлагаю. Во-первых, здесь я предлагаю наиболее легкий путь. На самом деле все это можно проделать руками, добавиви
Автомаунт папок хоста в Ubuntu 18/19 на VirtualBox
Всю эту информацию не особенно сложно найти в интернете, но я не встречал её всю в одном месте. Исправляю ситуацию. В первую очередь, чтобы самому в следующий раз опять не гуглить. Договоримся, что у вас уже есть виртуальная машина с убунтой и установленными дополнениями гостевой ОС. 1. В убунте создаём папку, куда будет маунтиться папка с
Язык Go — хинты. 03 — углубленные срезы
Уж извините, лучше название не придумалось. 🙂 Допустим, у нас есть срез со строками. По какой-то причине нам нужно взять его часть и использовать где-то ещё. Допустим, при использовании нам требуется добавить новый элемент. Как новичёк и не до конца понимающий работу срезов в Go, я бы сделал так:
1 2 3 |
x := []string{"one", "two", "three", "four"} y := x[1:3] y = append(y, "five") |
И ожидал бы увидеть
1 2 3 4 |
fmt.Println(len(x), cap(x), x) // 4 4 [one two three four] fmt.Println(len(y), cap(y), y) // 3 4 [two three five] |
Язык Go — кратко. Часть 8. Структуры и интерфейсы
В языке Go очень своеобразная модель ООП. Её называют «утиной типизацией». Здесь нет наследования. Зато есть встраивание, которое частично заменяет наследование. Здесь нет перегрузки и переопределения методов. Всё упрощено до предела, чтобы уменьшить возможность построить сложно поддерживаемую систему, изменения в базовых классах которой вполне могут привести к нарушениям и неожиданному поведению в работе программы. Что мы
Язык Go — кратко. Часть 7. «Исключения»
В языке Go нет исключений в том виде, к которому мы привыкли в С/С++, Java, Python и т.п. языках. Здесь вообще не принято доводить ситуацию до настолько критической, когда происходит экстренное «выбрасывание» куда-то далеко наверх по дереву вызовов. Путь Go — проверка входящих данных и различных условий. Если можем работать — работаем. Если не можем
Язык Go — кратко. Часть 6. Каналы
Каналы крайне полезная штука и используются для передачи данных между рутинами, а также для синхронизации. Альтернативный способ — локи. Но каналы — идейно правильный. 😉 Каналы могут быть синхронными и асинхронными, двунаправленными и однонаправленными. Синхронный канал приводит к остановке кода при чтении, пока в канал не отправят данные, и при записи, пока из канала не
Язык Go — хинты. 02 — загрузка конфига
Обычная задача — есть конфиг нашей программы в каком-нибудь файле и нам надо его загрузить для последующего использования. Конфиги сейчас можно хранить в чём-нибудь вроде YAML или хотя бы JSON или XML. Допустим, наш в ямле.
1 2 3 4 |
option1: string value 1 option2: - option3: string value 3 - option4: 4 |
В отличие от JSON и XML, для YAML официального пакета пока нет. Поэтому гуглим и находим нужное.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import "gopkg.in/yaml.v2" type Option2 struct { Option3 string `yaml:"option3"` Option4 int `yaml:"option4"` } type Config struct { Option1 string `yaml:"option1"` Option2 Option2 `yaml:"option2"` } configData, err := ioutil.ReadFile(configFilename) if err != nil { log.Fatalf("error: %v", err) } conf = Config{} err = yaml.Unmarshal(configData, &conf) if err != nil { log.Fatalf("error: %v", err) } |
Язык Go — хинты. 01 — замена подстроки
Замена подстроки в строке
1 2 |
str := "какая-то строка" str = strings.Replace(str, "какая-то", "какая-то другая", -1) |
Если нам надо заменить множество одних подстрок на множество других
1 2 3 |
r := strings.NewReplacer("какая-то", "какая-то другая", "стро", "строй") str := "какая-то строка" str = r.Replace(str) |
В определённых случаях может оказаться удобнее использовать регулярные выражения. Надо только помнить, что в регулярках go обратные ссылки недоступны, т.е. не получится сделать регулярку вроде такой (\w+)=(‘|»)(.*?)\2 и получить одним махом всё красиво. Поиск и замена при помощи регулярок
Язык Go — кратко. Часть 5. Указатели
В языке Go есть три вида переменных — обычные (значения чисел, строк, массивы), ссылочные (срезы и мапы) и указатели. Кратенько рассмотрим отличия. Обычные переменные — это просто переменные, хранящие конкретное значение. При передаче в функцию для таких переменных создаётся копия. Для строк, правда, иначе — их скорее правильно рассматривать как ссылочные неизменяемые переменные. Ссылочные переменные
Язык Go — кратко. Часть 4. Отложенное выполнение
В языке Go есть приятная удобная штука — отложенное выполнение функций. Откладывается выполнение до момента непосредственно перед выходом из текущей функции. Удобно в первую очередь для закрытия файлов, каналов и т.п. Пример:
1 2 3 4 5 6 7 8 9 |
func main() { file, err := os.Open("/my/file/path") if err == nil { fmt.Println("алярм!") os.Exit(-1) } defer file.Close() ... } |
defer file.Close() говорит, что перед выходом из текущей функции — main() — надо вызвать file.Close() Если есть потребность, можно указать безымянную функцию.