jsonFile, err := os.Open("referenceData/ex.json")
if err != nil {
return err
}
defer jsonFile.Close() // первый defer
byteValue, err := ioutil.ReadAll(jsonFile)
if err != nil {
return err
}
err = json.Unmarshal(byteValue, &exToParse)
if err != nil {
return err
}
jsonFile, err = os.Open("referenceData/di.json") // перезапись jsonFile
if err != nil {
return err
}
defer jsonFile.Close() // нужно ли заново объявлять defer jsonFile.Close()?
byteValue, err = ioutil.ReadAll(jsonFile)
if err != nil {
return err
}
err = json.Unmarshal(byteValue, &diToParse)
if err != nil {
return err
}
Сначала инициализируем переменную не через
var
, а сразу передаём значение. Потом сразу пишем defer jsonFile.Close()
. Потом в этот же файл загружаем другой json, и так же пишем defer jsonFile.Close()
.Вопрос — а нужен ли второй
defer
? По идеи в ОЗУ, после перезаписи, jsonFile
один и тоже, с тем же адресом, но только с другим содержанием.defer
, вычисляются в момент использования defer
. Вот простой пример, где это видно:type T int
func (t T) Close() { fmt.Println(int(t)) }
// ...
t := T(1)
defer t.Close()
t = T(2)
defer t.Close()
// 2
// 1
Вообще, не рекомендуется переиспользовать переменные подобным образом, так как это усложняет понимание текста программы.
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Язык Go имеет в своем распоряжении полный набор утилит, выполняемых из командной строки. 99% вы про них знаете, но повторение — мать учения)
Если имя пакета не
main
, то после того, как вы выполните go build
, ничего не скомпилируется. Если вы хотите скомпилировать файл .a
в $GOPATH/pkg
, Вам вместо этого нужно выполнить go install
._obj/ // старый каталог object
_test/ // старый каталог test
_testmain.go // старый каталог gotest
test.out // старый каталог test
build.out // старый каталог test
*.[568ao] // объектные файлы
DIR(.exe) // создано go build
DIR.test(.exe) // создано go test -c
MAINFILE(.exe) // создано go build MAINFILE.go
Эта команда, например, используется, чтобы почистить проект от файлов перед тем, как загрузить его на Github. Эти файлы полезны на этапе тестов, но не нужны для контроля версий.
go fmt
сделает всю работу за вас. Просто выполните команду go fmt <Имя файла>.go
в терминале. go install
. Перед использованием этой команды убедитесь, что у вас установлены соответствующие инструменты:BitBucket (Mercurial Git)
GitHub (git)
Google Code (Git, Mercurial, Subversion)
Launchpad (Bazaar)
Остальные утилиты можно глянуть по ссылке
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Golang
— Секция 1, системный минимум
— Секция 2, минимум по Go
— Секция 3, форматы данных
— Секция 4, базы данных
— Секция 5, сети
— Секция 6, брокеры, очереди сообщений
— Секция 7, инфраструктура и архитектура
— Секция 8, алгоритмы
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
К примеру, при вводе строки "Привет мир, hello world, hello мир, привет world" на выходе должен получится такой список список :
привет - 2;
мир - 2;
hello - 2;
world -2;
Как написать такую функцию?
package main
import (
"fmt"
"regexp"
"strings"
)
//Создаём структуру для хранения кол-ва слов и самих слов
type Words struct {
i int // кол-во слов
s string // тут само слово
}
func main() {
str := "Привет мир, hello world, hello мир, привет world, , "
// приводим всё в нижний регистр для устранения проблем с различием слов 'Привет' и 'привет'
str = strings.ToLower(str)
// Разбиваем строку на массив строк по регулярному выражению, ищем либо ',' либо ' ' (пробел)
arr := regexp.MustCompile("[,| ]+").Split(str, -1)
//создаём массив структур для хранения результатов
ret := []Words{}
chk := false
// проходим циклом для сранения есть ли такое слово в массиве ret или нет
k := 0
for i := 0; i < len(arr); i++ {
chk = false
for k = 0; k < len(ret); k++ {
if arr[i] == ret[k].s {
// если слово уже есть увеличивем счётчик и слово пропускаем
ret[k].i += 1
chk = true
}
}
// если chk true то слово уже есть и ничего делать ненадо
if !chk {
// проверяем что в строке есть буквы и если они есть добавляем её в массив с результатами
if regexp.MustCompile("[a-zа-яё]+").MatchString(arr[i]) {
tmp := Words{i: 1, s: arr[i]}
ret = append(ret, tmp)
}
}
}
// выводим результат
for l := 0; l < len(ret); l++ {
fmt.Printf("%v - %v\n", (ret[l].s), (ret[l].i))
}
}
P.S.: проверка
if regexp.MustCompile("[a-zа-яё]+").MatchString(arr[i])
нужна для того чтобы в результаты не пролез мусор в виде пробелов если пользователь введёт что-то типа:"Привет мир, hello world, hello мир, привет world, , "
хотя это можно сделать и красивее.
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🚩 Товарищи разработчики!
В честь дня международной солидарности трудящихся информируем вас о возможности получить подарок при покупке обучающего курса Слёрм с 1 по 7 мая 2024 года.
🎈«Kubernetes для разработчиков», старт 27 мая.
+ Видеокурс «Docker» в подарок
- Ваш завод растет и принято решение переносить сервисы на K8s?
- Недоумеваете как работает контейнеризация и что такое оркестрация?
- Не можете достичь взаимного понимания с DevOpsами?
Применяйте промокод MAYSLURM при оплате обучения, забирайте бесплатный курс, осваивайте новые инструменты и двигайте технологический прогресс!
Мир! Труд! Май! Слёрм!
Реклама ООО «Слёрм» ИНН 3652901451
В честь дня международной солидарности трудящихся информируем вас о возможности получить подарок при покупке обучающего курса Слёрм с 1 по 7 мая 2024 года.
🎈«Kubernetes для разработчиков», старт 27 мая.
+ Видеокурс «Docker» в подарок
- Ваш завод растет и принято решение переносить сервисы на K8s?
- Недоумеваете как работает контейнеризация и что такое оркестрация?
- Не можете достичь взаимного понимания с DevOpsами?
Применяйте промокод MAYSLURM при оплате обучения, забирайте бесплатный курс, осваивайте новые инструменты и двигайте технологический прогресс!
Мир! Труд! Май! Слёрм!
Реклама ООО «Слёрм» ИНН 3652901451
github.com/nxadm/tail
, которая следит за обновлениями в файле.А код для решения задачи может выглядеть так:
package main
import (
"fmt"
"github.com/nxadm/tail"
)
var logFile = "log.log"
func main() {
t, err := tail.TailFile(logFile, tail.Config{Follow: true})
if err != nil {
panic(err)
}
for line := range t.Lines {
fmt.Println(line.Text)
}
}
Этот код следит за обновлениями в файле
log.log
и бесконечно читает оттуда новые строки.@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
У нас вышла статья, в которой мы рассказываем про основы системного программирования на Go, мы изучим как работать с ядром, юзерспейсом линукса. Расскажу об стандарте POSIX, а также узнаем, как сочетать C и Go-код.
https://habr.com/ru/articles/811587/
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
os/user
:package main
import (
"os/user"
"log"
"fmt"
)
func main() {
// текущий пользователь
cur, err := user.Current()
if err != nil {
log.Fatal(err)
}
fmt.Println("Current user:", cur)
}
Есть ещё выбор пользователя по имени и по идентификатору.
os.Hostname
.@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Рассмотрим здесь 2 известных алгоритма поиска: линейный и бинарный.
Алгоритм:
1. Начните с первого элемента списка.
2. Сравните его с искомым элементом.
3. Если элемент совпадает с искомым, верните его индекс
4. Если элемент не совпадает с искомым, перейдите к следующему элементу в списке.
5. Повторяйте шаги 2-4 до тех пор, пока не найдете искомый элемент или не пройдете весь список.
Линейный поиск имеет временную сложность
O(n)
, где n
— это количество элементов в списке.Алгоритм:
1. Начните с определения границ поиска. Установите начальную границу (left) в начало списка и конечную границу (right) в его конец.
2. Найдите средний элемент между начальной и конечной границей.
3. Сравните средний элемент с искомым значением.
4. Если средний элемент совпадает с искомым значением, возвращаем его индекс
5. Если средний элемент больше искомого значения, обновите конечную границу (right) на позицию перед средним элементом и перейдите к шагу 2.
6. Если средний элемент меньше искомого значения, обновите начальную границу (left) на позицию после среднего элемента и перейдите к шагу 2.
7. Повторяйте шаги 2-6 до тех пор, пока не будет найден искомый элемент или пока начальная граница (left) не станет больше конечной границы (right).
Бинарный поиск имеет временную сложность
O(log n)
, где n
- это количество элементов в списке. Это означает, что в худшем случае алгоритм будет выполняться за логарифмическое время, что является значительно более эффективным, чем линейный поиск.@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥Подборка лучших обучающих каналов для программистов.
➡️ Делитесь с коллегами и сохраняйте себе, чтобы не потерять
⚡Машинное обучение
Machine Learning - запускаем лучшие ИИ модели, пишем код, погружаемся в нейросети
Ml Собеседование - подготовка к собесу по мл, алгоритмам, коду
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат
🏆 Golang
Golang
Golang собеседование - разбор задач и вопросов с собесов
Golang вакансии -работа для Go разработчика
Golang книги библиотека книг
Golang задачи и тесты
Golang чат
Golang news - новости из мира go
Golang дайджест
💥 Linux /Этичный хакинг
Linux Academy - гайды, секреты и лучшие материалы по Linux
Kali linux - погрузись в мир этичного хакинга и кибербезопасности
linux_kal - kali чат
Информационная безопасность
🚀 Data Science
Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data
🛢Базы данных
Sql базы данных - научим работе с базами данных профессионально
Библиотека баз данных
SQL чат
Вакансии Sql аналитик данных
#️⃣C#
С# академия - лучший канал по c#
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа
🐍 Python
Python/django - самый крупный обучающий канал по Python
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги
☕ Java
Java академия - java от Senior разработчика
Java вакансии
Java чат
Java вопросы с собеседований
Java книги
💻 C++
C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии
⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend
🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов
📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки
🇬🇧 Английский для программистов
🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence
🔥 DevOPs
Devops для программистов
Книги Devops
🌟 Docker/Kubernets
Docker
Kubernets
📓 Книги
Библиотеки Книг для программситов
💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
💥 Бесплатный Chatgpt бот
➡️ Делитесь с коллегами и сохраняйте себе, чтобы не потерять
⚡Машинное обучение
Machine Learning - запускаем лучшие ИИ модели, пишем код, погружаемся в нейросети
Ml Собеседование - подготовка к собесу по мл, алгоритмам, коду
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат
🏆 Golang
Golang
Golang собеседование - разбор задач и вопросов с собесов
Golang вакансии -работа для Go разработчика
Golang книги библиотека книг
Golang задачи и тесты
Golang чат
Golang news - новости из мира go
Golang дайджест
💥 Linux /Этичный хакинг
Linux Academy - гайды, секреты и лучшие материалы по Linux
Kali linux - погрузись в мир этичного хакинга и кибербезопасности
linux_kal - kali чат
Информационная безопасность
🚀 Data Science
Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data
🛢Базы данных
Sql базы данных - научим работе с базами данных профессионально
Библиотека баз данных
SQL чат
Вакансии Sql аналитик данных
#️⃣C#
С# академия - лучший канал по c#
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа
🐍 Python
Python/django - самый крупный обучающий канал по Python
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги
☕ Java
Java академия - java от Senior разработчика
Java вакансии
Java чат
Java вопросы с собеседований
Java книги
💻 C++
C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии
⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend
🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов
📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки
🇬🇧 Английский для программистов
🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence
🔥 DevOPs
Devops для программистов
Книги Devops
🌟 Docker/Kubernets
Docker
Kubernets
📓 Книги
Библиотеки Книг для программситов
💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
💥 Бесплатный Chatgpt бот
В этой статье мы рассмотрим один из самых простых паттернов — Adapter. Когда его используем:
@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
new()
, и через имя структуры + фигурные скобки, т.е. Foo{}
?type Foo struct {
X int
}
f1 := &Foo{}
f2 := new(Foo)
Foo
и возвращается указатель *Foo
на вновь созданный элемент. Только в первом случае можно еще указывать параметры
f1 := &Foo{100}
. Зачем нужны два одинаковых метода? Первый
&
является частью указателей и применяется для операций с ними, второй для явного создания пустого объекта.@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы для начинающих, для тех, кто только вливается в Go
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM