Что выведет код?
package main
import (
"errors"
"fmt"
)
var ErrNotFound = errors.New("Resource was not found")
func main() {
err := raise()
if err == ErrNotFound {
fmt.Println("impossible")
return
}
if err != nil {
fmt.Println("unexpected error")
return
}
}
func raise() error {
return ErrNotFound
}
Ответ🥱3👍1👎1
Что выведет код ?
package main
import "fmt"
func main() {
animals := []string{"bear", "bear", "rabbit", "wolf"}
for _, animal := range animals {
switch animal {
case "rabbit":
fmt.Println(animal, "is so weak!")
fallthrough
case "bear", "wolf":
fmt.Println(animal, "is so strong!")
}
}
}
ОтветЧто выведет код?
package main
func f(n int) (r int) {
defer func() {
r += n
recover()
}()
var f func()
defer f()
f = func() {
r += 2
}
return n + 1
}
func main() {
println(f(3))
}
Ответgo.dev
Go Playground - The Go Programming Language
🤯5
Generic Data Structures and
Algorithms in Go
Автор: Richard Wiener
Год издания: 2022
#go #en
Скачать книгу
Algorithms in Go
Автор: Richard Wiener
Год издания: 2022
#go #en
Скачать книгу
🔴 Dot: элегантное решение для манипуляции данными в Golang
Мы разработали удивительный новый пакет для Golang на GitHub, который позволяет легко вносить изменения в структуры с использованием пути к полям, разделенных точками:
➡️ Идея возникла, когда нам понадобилось обновить данные во множестве структур для последующей передачи в API. Мы знали точные пути ко всем полям, но не хотели делать это вручную. Именно тогда родился Dot!
Если вы поддерживаете open-source, мы будем благодарны за вашу ⭐️ нашему репозиторию на GitHub. Вместе мы делаем разработку в Go еще лучше!
🌍 Github: https://github.com/mowshon/dot (очень подробная документация - на английском) 🇬🇧
📚 Статья на русском языке: https://golangify.com/dot
Мы разработали удивительный новый пакет для Golang на GitHub, который позволяет легко вносить изменения в структуры с использованием пути к полям, разделенных точками:
Field1.Field2.Field3
. ➡️ Идея возникла, когда нам понадобилось обновить данные во множестве структур для последующей передачи в API. Мы знали точные пути ко всем полям, но не хотели делать это вручную. Именно тогда родился Dot!
Если вы поддерживаете open-source, мы будем благодарны за вашу ⭐️ нашему репозиторию на GitHub. Вместе мы делаем разработку в Go еще лучше!
🌍 Github: https://github.com/mowshon/dot (очень подробная документация - на английском) 🇬🇧
📚 Статья на русском языке: https://golangify.com/dot
👍8💩4
Вопрос с собеседования. Как устроен слайс и чем он отличается от массива?
Ответчерез пару часов завтра.
#собеседование
Ответ
#собеседование
Ответ на «Как устроен слайс и чем он отличается от массива?»
Срезы (
Также в Go имеется оператор среза : , который позволяет создавать новый срез и содержит указанную последовательность от и до:
Срезы (
slice
) в отличие от массивов могут менять свою длину. То есть можно добавлять новые элементы, или удалять уже существующие.Также в Go имеется оператор среза : , который позволяет создавать новый срез и содержит указанную последовательность от и до:
// исходный массив
initialUsers := [8]string{"Bob", "Alice", "Kate", "Sam", "Tom",
"Paul", "Mike", "Robert"}
users1 := initialUsers[2:6] // с 3-го по 6-й
users2 := initialUsers[:4] // с 1-го по 4-й
users3 := initialUsers[3:] // с 4-го до конца
fmt.Println(users1) //["Kate", "Sam", "Tom", "Paul"]
fmt.Println(users2) //["Bob", "Alice", "Kate", "Sam"]
fmt.Println(users3) //["Sam", "Tom", "Paul", "Mike", "Robert"]
👍3🥰2💩2🤡1
😱11👍2
Пакет context в Go: взгляд профессионала
Пакет context появился как x/net/context в 2014 году и быстро обрел популярность. В 2016 году его добавили в стандартную библиотеку Go 1.7. С тех пор практически ни одно приложение на Go не обходится без его использования, потому что пакет ощутимо упрощает многие задачи.
💎 Чат: ссылка
🌍 Статья: https://habr.com/ru/companies/pt/articles/764850/
Пакет context появился как x/net/context в 2014 году и быстро обрел популярность. В 2016 году его добавили в стандартную библиотеку Go 1.7. С тех пор практически ни одно приложение на Go не обходится без его использования, потому что пакет ощутимо упрощает многие задачи.
💎 Чат: ссылка
🌍 Статья: https://habr.com/ru/companies/pt/articles/764850/
👍7😁1
🧰 Как устроены мапы под капотом: гайд для Go-разработчика
Павел Комаров из AvitoTech в подробностях рассмотрел процесс записи и чтения данных в мапы, важность передачи количества элементов при создании мапы, а также уделил внимание проблеме переполнения и эвакуации элементов, даже до уровня отдельных битов.
👉 Читать
Павел Комаров из AvitoTech в подробностях рассмотрел процесс записи и чтения данных в мапы, важность передачи количества элементов при создании мапы, а также уделил внимание проблеме переполнения и эвакуации элементов, даже до уровня отдельных битов.
👉 Читать
👍7❤3🔥1👏1
🤔 Context vs структура: следует ли передавать информацию, специфичную для запроса, через
HTTP-обработчики могут использовать контекст для управления тайм-аутами запросов или отменой в рамках запроса. Тип
❓Следует ли использовать этот механизм для передачи информации по цепочке вызовов запроса? Или лучше использовать обычную структуру?
Вот две причины, по которым использование
Значения в
Если вы видите функцию, принимающую параметр
❓Но разве
Чистый код сам по себе не является целью. Код не чист только потому, что он короткий. Код чистый, если читатель может ясно видеть, что он делает.
❓Так
Значения в контексте могут быть полезны, если они не критичны для бизнес-логики приложения. Например, совершенно нормально передавать идентификаторы запросов для логирования или измерения метрик. Читатель все равно сможет понять логику кода, и если что-то пойдет не так с этим идентификатором, это повлияет только на логирование или метрики приложения, но не на результат запроса.
💡Если данные важны для вашей бизнес-логики, не помещайте их в
#tip
context.Context
?HTTP-обработчики могут использовать контекст для управления тайм-аутами запросов или отменой в рамках запроса. Тип
Context
также позволяет передавать значения (например, идентификатор пользователя, связанный с запросом) другим функциям.❓Следует ли использовать этот механизм для передачи информации по цепочке вызовов запроса? Или лучше использовать обычную структуру?
Вот две причины, по которым использование
Context
для передачи значений может быть плохой идеей:Значения в
Context
представляют собой пары ключ/значение, где ключ и значение являются пустыми интерфейсами (т. е. any
). Другими словами, значения в контексте — это как мешок со всем подряд. Компилятор не может помочь вам отловить ошибки типов или даже проверить, есть ли информация. Удачи в устранении неполадок 😉Если вы видите функцию, принимающую параметр
Context
, вы не можете сказать, что внутри. Если вы видите функцию, которая принимает параметр структуры, вы можете ясно видеть, что данные передаются, и что это за данные.❓Но разве
doSomething(ctx)
не выглядит намного чище, чем doSomething(ctx, someStruct)
?Чистый код сам по себе не является целью. Код не чист только потому, что он короткий. Код чистый, если читатель может ясно видеть, что он делает.
❓Так
context.WithValue()
следует избегать?Значения в контексте могут быть полезны, если они не критичны для бизнес-логики приложения. Например, совершенно нормально передавать идентификаторы запросов для логирования или измерения метрик. Читатель все равно сможет понять логику кода, и если что-то пойдет не так с этим идентификатором, это повлияет только на логирование или метрики приложения, но не на результат запроса.
💡Если данные важны для вашей бизнес-логики, не помещайте их в
Context
.#tip
👍14❤1
👍3
Ответ на «Как проверить тип переменной в среде выполнения?»
Лучшим способом проверки типа переменной при выполнении является Type Switch (переключатель типов). Переключатель типов оценивает переменные по типу, а не значению. Каждый такой переключатель содержит не менее одного
Например, можно создать Type Switch, проверяющий, содержит ли значение i интерфейса тип
Лучшим способом проверки типа переменной при выполнении является Type Switch (переключатель типов). Переключатель типов оценивает переменные по типу, а не значению. Каждый такой переключатель содержит не менее одного
case
, который выступает в роли инструкции условия, а также кейс default
, которые выполняется, если ни один из кейсов не верен.Например, можно создать Type Switch, проверяющий, содержит ли значение i интерфейса тип
int
или string
:package main#собеседование
import "fmt"
func do(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("Double %v is %v\n", v, v*2)
case string:
fmt.Printf("%q is %v bytes long\n", v, len(v))
default:
fmt.Printf("I don't know type %T!\n", v)
}
}
func main() {
do(21)
do("hello")
do(true)
}
👍5