Держите полезный ресурс, здесь показана большая часть того, что понадобится в реальной работе с Go: структуры, интерфейсы, создание своего веб-сервера, межсайтовый скриптинг, работа с БД и много всего ещё.
Очень полезно, рекомендую
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Golang
Мощная шпаргалка по Go, которая покрывает практически все темы
Если пролистать хотя бы по диагонали, есть отличный от нуля шанс пройти собеседование и получить оффер)
Что внутри?
├╼
Компилятор├╼
Пакеты├╼
Функции├╼
Управление памятью├╼
Операторы├╼
Управляющие структуры├╼
Объектноориентированность├╼
Интерфейсы├╼
Обработка ошибок├╼
Горутины (Goroutine)├╼
Проверка управления памятью├╼
Reflect ├╼
Добавление кода C├╼
GUI╰╼
Распределенные системы@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Итак, задача: написать свою фукнцию
sleep
time.After
, вот так:package main
import (
"log"
"time"
)
func sleep(d time.Duration) {
select {
case <-time.After(d):
}
}
func CallSleep() {
log.Println("Do something")
sleep(5 * time.Second)
log.Println("Something else")
}
Но выглядит как-то громоздко, да и вообще.
func sleep2(d time.Duration) time.Time {
ticker := time.Tick(d)
for done := range ticker {
return done
}
return time.Now()
}
func sleep(d time.Duration) {
<-time.After(d)
}
Ну вот, то, что нужно
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
network_api -> data(UseCase->Repository)
. Так как все
http
хендлеры обрабатываются параллельно, то каким образом корректно протянуть зависимости репозиториев и use_case
объектов в слой network_api
? То есть это будут синглтоны или же их нужно создавать для каждого отдельного request
? Что насчёт доступа к общим ресурсам?
Например,
use_case
при загрузке читает json
-конфигурацию и в дальнейшем к ней обращается по многим путям из слоя nwtwork_api
.Есть какие нибудь best practices?
Если наши данные терпимы к параллельному одновременному доступу — тогда можно не замарачиваться. Если же нельзя одновременно из нескольких потоков обращаться к менеджеру данных — тогда стоит ввести глобальную блокировку. Фактически, такой глобальной блокировкой будет являться единственное соединение к базе данных.
Вот и всё, пожалуй
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Держите полезную статью о тестировании Go-приложений
Что внутри?
ExecuteTest
, передавая контекст и testing.TB
или provider.T
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Но если ты посмотришь это видео, то будешь знать ответы, и во всеоружии встретишь такие вопросы, если они попадутся
Уверен, будет полезно)
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
var _ myInterface = &myImplementation{}
:type T struct{}
var _ I = T{} // Проверка, что T имплеменирует I.
var _ I = (*T)(nil) // Проверка, что *T имплеменирует I.
Обычно это указывают, чтобы ошибки были выявлены уже во время компиляции.
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Держите годный контент)
Тут неплохой список тем, которые с большой вероятностью будут обсуждаться на собеседовании + теория по самому важному
Собственно, теория покрывает такие разделы:
├╼
Скалярные├╼
Массив и слайс├╼
Map├╼
Структура╰╼
Интерфейс├╼
Каналы├╼
Горутины├╼
Sync╰╼
ПаттерныУверен, будет полезно) Успешных собеседований
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Держите репозиторий с вопросами по Golang. Здесь вы найдете вопросы, которые могут быть заданы на собеседовании, с подробными разъяснениями и анализом различных corner cases. Представьте, что это ваши билеты на экзамен - вытягивайте билет и готовьтесь!
Здесь затрагиваются самые важные темы Go, в том числе:
• Slices
• Maps
• Указатели
• Goroutines и Channels
• Работа со строками
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
io.Pipe
для создания туннеля между писателем и читателем.// отправляем пользователю ответ с аттачем
//reader, writer := io.Pipe()
writer := new(bytes.Buffer)
err = main.Doc.Save(writer) // метод Документа из unioffice - принимает io.Writer, сохраняет тип Document в zip.
//writer.Close() // для Pipe
...
reader := bytes.NewReader(writer.Bytes())
...
nbytes, err := io.Copy(w, reader) // w это http.ResponseWriter
При запуске эта программа зависает, поэтому приходится использовать промежуточный буфер, как видно из кода. Что здесь не так с использованием Pipe?
Нужно просто вызов
Writer
обернуть в горутину, иначе все блокируется.go func () {
defer writer.Close()
err = main.Doc.Save(writer) // принимает io.Writer
...
}
}()
Вот и всё
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Sub
из пакета time
.func main() {
// В високосном году 2096 будет 366 дней
t1 := Date(2096, 1, 1)
t2 := Date(2097, 1, 1)
days := t2.Sub(t1).Hours() / 24
fmt.Println(days) // 366
}
func Date(year, month, day int) time.Time {
return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC)
}
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
map
:map[
/dbus-service:map[
org.freedesktop.DBus.Introspectable:map[]
org.freedesktop.DBus.Peer:map[]
org.freedesktop.DBus.Properties:map[]
Basket:map[
Fruit:"Apple"
]
]
При конвертации в
json
значение поле Fruit
"теряется":"/dbus-service":{
"org.freedesktop.DBus.Introspectable":{},
"org.freedesktop.DBus.Peer":{},
"org.freedesktop.DBus.Properties":{},
"Basket":
{
"Fruit":{}
}
}
Для вывода используется это:
fmt.Printf("%v", data)
jsonData, _ := json.Marshal(data)
fmt.Printf("json data: %s", jsonData)
Вопрос на засыпку: почему так происходит с
Fruit
?Marshal
'aлятся у Fruit:"Apple"
."Apple"
— имеет тип данных dbus.Variant
У него нету "публичных" свойств. Неэкспортируемых.
Экспортируемые пишутся с большой буквы.
Неэкспортируемые с маленькой.
Решение: создавать новое дерево
map
'ов с примитивными данными (string
вместо dbus.Variant
) путем рекурсии.@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM