

- Главная
- Каталог
- Интернет технологии
- Golang задачи и тесты
Статистика канала
Полная статистикаchevron_right
package main
import (
"encoding/json"
"fmt"
"reflect"
)
type S struct {
A []int `json:"a"`
B []int `json:"b"`
}
func main() {
var a []int // nil
b := []int{} // пустой
fmt.Println(a == nil, len(a), cap(a)) // ?
fmt.Println(b == nil, len(b), cap(b)) // ?
fmt.Println(reflect.DeepEqual(a, b)) // ?
x := S{A: a, B: b}
d, _ := json.Marshal(x)
fmt.Println(string(d))
}
{}
Ответ:
true 0 0
false 0 0
false
{"a":null,"b":[]}
👉 Запустить код: https://go.dev/play/p/PaqGcSwGqpV
package main
func main() {
const (
iota = iota
Y
)
println(Y)
}{}
На первый взгляд - всё понятно. Но на самом деле это ловушка 😏
Вы переопределяете iota как обычную константу, равную самой себе (iota = iota). С этого момента iota перестаёт быть магической переменной, и счётчик сбрасывается.
Поэтому Y получает значение 0, а не 1 — как многие ожидают.
Вывод программы: 0
💡 Мораль: никогда не переназначайте iota внутри const, иначе потеряете её «магию».
Запустить код: https://go.dev/play/p/7xu1qRUcp2O
const N = 1 << 12
func f(){
for a, i := [N]int{}, 0; i < len(a); i++ {
a[i] = i * i * i * i
}
}
func doNothing(a []int) {}
func g(){
for a, i := [N]int{}, 0; i < len(a); i++ {
doNothing(a[:])
}
}
{}
- f делает три умножения на итерацию плюс запись в массив. Это «дешёвая» арифметика с линейным проходом по памяти.
- g на каждой итерации создаёт срез a[:] и вызывает doNothing. Если компилятор встраивает пустую функцию и выкидывает бесполезный срез, тело цикла почти исчезает. Если запретить инлайнинг, вы получите N вызовов функции и накладные расходы на создание среза на каждой итерации.
Чего ожидать?
С инлайнингом и DCE: g() часто быстрее f(), потому что почти ничего не делает, тогда как f() реально пишет в память. Отношение g()/f() < 1.
Без инлайнинга: g() резко замедляется из-за стоимости вызова функции и построения среза на каждой итерации. Отношение g()/f() ≫ 1, иногда на порядок.
Вывод: результат зависит от оптимизаций компилятора. «Смысл» цикла, который не производит наблюдаемых эффектов, Go охотно выкидывает.
Как проверить у себя
Копировать код
# обычный режим
go test -bench . -benchmem
# отключить инлайнинг -l, чтобы увидеть цену вызова функции
go test -gcflags='-l' -bench . -benchmem
{}
Что запомнить
- Микробенчи в Go чувствительны к инлайнингу и dead-code elimination.
- Запись в память удерживает цикл «реальным», тогда как пустые вызовы и срезы могут исчезнуть.
- Измеряйте обе конфигурации: с оптимизациями и без, чтобы понять истинную стоимость.
Если коротко:
- В реальном билде с оптимизациями g()/f() обычно < 1.
- С запретом инлайнинга g()/f() обычно ≫ 1 из-за накладных расходов вызова.Отзывы канала
всего 2 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Golang задачи и тесты — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 7.7K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 24.2, количество отзывов – 2, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 8251.74 ₽, а за 42 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий