Irbisa · Шпаргалка
Структуры, методы и интерфейсы
Структуры, встраивание, наборы методов, неявные интерфейсы, type switch
Как в Go устроено ООП без классов: что используется для инкапсуляции, наследования и полиморфизма?
Чем литерал структуры с именами полей
T{Name: v}отличается от позиционногоT{v1, v2}и какой из них стоит писать?package geo import "net" type Point struct{ X, Y int }…Почему нельзя добавить метод к
time.Timeилиintи что делать вместо этого?package temp import ( "fmt" "time")…Какие структуры можно сравнивать через
==и использовать как ключ map и что меняет добавленное поле[]string?package keys type Point struct{ X, Y int } type Loose struct{ Tags []string }…Для чего в Go используют пустую структуру
struct{}?package sig import "fmt" type noopLogger struct{} // no state, only methods…Что такое интерфейс в Go и чем неявное соответствие отличается от
implementsв Java?package shapes import ( "fmt" "math")…Что такое пустой интерфейс
any, когда это правильный тип и когда вместо него нужны дженерики?package pick import "cmp" // any: the caller gets any back and must assert; nothing is checked.func MaxAny(xs []any) any {…Чем утверждение типа
v.(T)отличается от type switch и что происходит при неудачном утверждении сokи без него?package tsw import ( "fmt" "net/http")…Что такое
fmt.Stringerи почемуfmt.Sprintf("%v", u)внутриfunc (u User) String() stringпереполняет стек?package user import "fmt" type User struct { Name string…Когда методу нужен указательный получатель, а не получатель-значение?
package counter type Counter struct{ n int } // wrong: the receiver is a copy; the caller's Counter never changes.func (c Counter) IncBroken() { c.n++ }…Что такое набор методов и почему
Worker{}не соответствует интерфейсу, если у методаRunуказательный получатель?package work type Worker struct{ done int } func (w *Worker) Run() { w.done++ } // in the method set of *Worker onlyfunc (w Worker) Done() int { return w.done } // in both method sets…В Go нет конструкторов. Что такое соглашение
NewTи когда нужны функциональные опции?package server import ( "errors" "log/slog" "time"…Что напечатает эта программа и почему
Outer.Nameне переопределяетName, который вызываетDescribe?type Base struct{} func (Base) Name() string { return "base" }func (b Base) Describe() string { return "I am " + b.Name() } type Outer struct{ Base } func (Outer) Name() string { return "outer" } func main() { o := Outer{} fmt.Println(o.Name()) fmt.Println(o.Describe()) fmt.Println(o.Base.Name())}Что даёт встраивание интерфейса в структуру и когда это полезно?
package mw import ( "log/slog" "net/http" "sort"…Найдите баг: в журнале аудита, который пишет
logEvent, только временные метки, аnameиuser_idтам не появляются.type Event struct { time.Time Name string `json:"name"` UserID int64 `json:"user_id"`} func logEvent(w io.Writer, e Event) error { b, err := json.Marshal(e) if err != nil { return err } _, err = w.Write(append(b, '\n')) return err}Что такое struct tag, как его читают пакеты вроде
encoding/jsonи что будет, если в теге опечатка?package api import ( "encoding/json" "fmt" "reflect"…В Go нет ключевого слова
implements. Как заставить компилятор проверить соответствие типа интерфейсу прямо там, где тип объявлен?package store import "context" type Store interface { Get(ctx context.Context, key string) ([]byte, error)…Где в Go объявлять интерфейс и что значит «принимай интерфейсы, возвращай структуры»?
Что напечатает этот код и почему вызов метода на nil-указателе не паникует?
type Tree struct { Left, Right *Tree Val int} func (t *Tree) Sum() int { if t == nil { return 0 } return t.Val + t.Left.Sum() + t.Right.Sum()} func main() { var t *Tree fmt.Println(t.Sum()) fmt.Println((&Tree{Val: 1, Left: &Tree{Val: 2}}).Sum())}Этот код печатает
false, а затем паникует. Почемуwне nil и как исправитьauditLog?func auditLog(enabled bool) io.Writer { var buf *bytes.Buffer if enabled { buf = new(bytes.Buffer) } return buf} func main() { w := auditLog(false) fmt.Println(w == nil) w.Write([]byte("x"))}Когда два значения интерфейса равны по
==и когда такое сравнение паникует в рантайме?package ifeq import ( "errors" "fmt")…Найдите баг: под нагрузкой сервис с этим
Cacheто падает сconcurrent map read and map write, то зависает.type Cache struct { mu sync.Mutex m map[string]string} func (c *Cache) Set(k, v string) { c.mu.Lock() defer c.mu.Unlock() c.m[k] = v} func (c Cache) Get(k string) string { c.mu.Lock() defer c.mu.Unlock() return c.m[k]}Как значение интерфейса представлено в рантайме (
eface,iface,itab) и во что обходится положить в интерфейс значение?// Simplified from runtime/runtime2.go and internal/abi (Go 1.25).package sketch import "unsafe" type _type struct{} // size, hash, kind, GC data...…Две структуры с одинаковыми четырьмя полями дают 24 и 16 байт под
unsafe.Sizeof. Что определяет раскладку структуры и когда стоит переставлять поля?package layout import ( "fmt" "unsafe")…