error
используется для обработки ошибок. Это встроенный интерфейс с одним методом Error() string
, который возвращает строковое описание ошибки. Любой тип, реализующий этот метод, удовлетворяет интерфейсу error
.
type MyError struct {
Message string
}
func (e *MyError) Error() string {
return e.Message
}
func someFunction() error {
return &MyError{"Something went wrong"}
}
В этом примере
MyError
реализует интерфейс error
через метод Error()
. Функция someFunction
возвращает ошибку типа MyError
. Это позволяет стандартизировать обработку ошибок и передавать их между функциями.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7💯1
func
и именем метода.Получатель может быть как значением, так и указателем. Если получатель — значение, метод работает с копией объекта. Если получатель — указатель, метод может изменять оригинальный объект.
type Rectangle struct {
width, height float64
}
// Метод с получателем по значению
func (r Rectangle) Area() float64 {
return r.width * r.height
}
// Метод с получателем по указателю
func (r *Rectangle) Scale(factor float64) {
r.width *= factor
r.height *= factor
}
Методы могут быть вызваны как для значения, так и для указателя на тип, компилятор автоматически преобразует вызов. Это упрощает работу с методами и делает код более гибким.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
var i interface{} = "hello"
s := i.(string) // Извлечение string из интерфейса
fmt.Println(s) // Вывод: hello
Если тип не совпадает, возникает паника. Чтобы избежать этого, используется форма с двумя возвращаемыми значениями:
s, ok := i.(string) // ok будет false, если тип не совпадает
Type assertion помогает работать с динамическими типами в интерфейсах, обеспечивая безопасное приведение типов.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9⚡2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
db.Query
используется метод из пакета database/sql
. Метод возвращает набор строк, который необходимо обработать и закрыть после использования.
rows, err := db.Query("SELECT id, name FROM users WHERE age > ?", 18)
if err != nil {
log.Fatal(err)
}
defer rows.Close() // Закрыть rows после завершения
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
Метод
Query
принимает SQL-запрос и аргументы, возвращая *sql.Rows
. После обработки данных важно закрыть rows
с помощью defer
, чтобы избежать утечек ресурсов. Ошибки на каждом этапе (запрос, итерация, сканирование) должны быть обработаны.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
net/http
. Создается обработчик, который принимает http.ResponseWriter
и *http.Request
, извлекает данные из запроса и возвращает ответ.
http.HandleFunc("/example", func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
return
}
param := r.URL.Query().Get("param") // Извлечение параметра из URL
fmt.Fprintf(w, "Received param: %s", param)
})
http.ListenAndServe(":8080", nil)
Метод
r.URL.Query()
позволяет получить параметры из URL. Обработчик проверяет метод запроса и возвращает ошибку, если метод не GET. Сервер запускается на указанном порту с помощью ListenAndServe
.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
os
предоставляет функции для взаимодействия с операционной системой, такие как работа с файлами, переменными окружения и процессами.
file, err := os.Create("example.txt") // Создание файла
if err != nil {
log.Fatal(err)
}
defer file.Close()
file.WriteString("Hello, OS package!") // Запись в файл
env := os.Getenv("HOME") // Получение переменной окружения
fmt.Println("Home directory:", env)
Метод
os.Create
создает файл, os.Getenv
извлекает значение переменной окружения. После работы с файлом его необходимо закрыть с помощью defer
. Пакет также поддерживает управление процессами, аргументами командной строки и другими системными функциями.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👀2❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
fmt
предоставляет функции для форматированного ввода и вывода. Основные функции: Print
, Println
, Printf
, Sprint
, Sprintf
, Fprintf
, Scan
, Scanf
, Scanln
. Функции
Print
, Println
и Printf
выводят данные в стандартный вывод. Println
добавляет пробел между аргументами и новую строку в конце. Printf
позволяет использовать форматирование:
fmt.Println("Hello", "World") // Hello World
fmt.Printf("Number: %d, String: %s\n", 42, "Go") // Number: 42, String: Go
Sprint
и Sprintf
возвращают строку вместо вывода:
s := fmt.Sprintf("Value: %v", 3.14) // s = "Value: 3.14"
Fprintf
выводит данные в произвольный io.Writer
:
fmt.Fprintf(os.Stderr, "Error: %s\n", "file not found")
Для ввода используются
Scan
, Scanf
, Scanln
, которые считывают данные из стандартного ввода.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
encoding/json
. Основная функция — json.Unmarshal
, которая принимает байтовый срез с JSON-данными и указатель на структуру, куда нужно сохранить результат.
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
data := []byte(`{"name": "John", "age": 30}`)
var p Person
err := json.Unmarshal(data, &p)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(p) // {John 30}
}
Структура
Person
содержит аннотации json:"name"
, которые указывают, как сопоставлять поля JSON с полями структуры. Если имена полей JSON и структуры совпадают, аннотации можно опустить. Ошибка при десериализации возвращается через err
.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Массив имеет фиксированную длину, которая определяется при объявлении.
var arr [3]int // Массив из 3 элементов
Срез — это динамическая структура, которая может изменять свой размер. Он ссылается на часть массива или создает новый массив под капотом.
slice := []int{1, 2, 3} // Срез с начальными значениями
slice = append(slice, 4) // Добавление элемента
Срезы более гибкие и чаще используются, так как их длина может изменяться во время выполнения программы. Массивы применяются реже, обычно когда требуется строгая фиксация размера.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
select
можно использовать канал time.After
, который возвращает значение через указанное время. Это позволяет организовать ожидание с ограничением по времени.
select {
case <-time.After(2 * time.Second):
fmt.Println("Timeout reached") // Сработает, если прошло 2 секунды
case result := <-someChannel:
fmt.Println("Received:", result) // Сработает, если данные пришли раньше
}
В этом примере, если данные не приходят на
someChannel
в течение 2 секунд, выполняется ветка с тайм-аутом. Это полезно для предотвращения бесконечного ожидания в каналах.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
T(v)
, где T
— целевой тип, а v
— значение.
var x int = 42
var y float64 = float64(x) // Приведение int к float64
var z uint = uint(y) // Приведение float64 к uint
Приведение работает только между совместимыми типами, например, числовыми. Попытка приведения несовместимых типов (например, строки к числу) вызовет ошибку компиляции. Для сложных преобразований используются функции из стандартной библиотеки, такие как
strconv.Atoi
.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1