
- Главная
- Каталог
- Интернет технологии
- Golang задачи и тесты
Статистика канала
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
defer fmt.Println(i)
}
for i := 0; i < 3; i++ {
defer func() {
fmt.Println(i)
}()
}
for i := 0; i < 3; i++ {
i := i
defer func() {
fmt.Println(i)
}()
}
}
{}
Ответ: https://go.dev/play/p/pntndQy2jzo
package main
import (
"fmt"
"unsafe"
)
type Foo struct {
A int64
}
type IFoo interface {
Get() int64
}
func (f Foo) Get() int64 { return f.A }
func main() {
var a int64 = 10
var s Foo = Foo{A: 42}
var i IFoo = s
fmt.Println(unsafe.Sizeof(a))
fmt.Println(unsafe.Sizeof(s))
fmt.Println(unsafe.Sizeof(i))
}
{}
Вопросы
• Сколько байт занимает a на x64?
• Сколько байт занимает s?
• Сколько байт занимает i?
• Почему размер i не равен размеру Foo?
• Что реально хранится внутри interface{} в Go?
Разберём по шагам, как это работает в Go на x64.
Код:
```go
var a int64 = 10
var s Foo = Foo{A: 42}
var i IFoo = s
```
1) Размер a
unsafe.Sizeof(a)
```go
int64 = 8 байт
```
На x64:
a = 8 байт
2) Размер s
```go
type Foo struct {
A int64
}```
В структуре одно поле int64.
```go
s = 8 байт
```
3) Размер интерфейса i
```go
var i IFoo = s
unsafe.Sizeof(i)
```go
На x64:
```go
i = 16 байт```
Запустить код: https://go.dev/play/p/NLIG3q-jFc9
package main
import "fmt"
type uint128 struct {
Hi uint64
Lo uint64
}
func f(φ uint128, β int) uint32 {
return uint32(φ.Hi >> (63 - β))
}
func main() {
x := uint128{Hi: 0x8000000000000001}
fmt.Println(f(x, 0))
fmt.Println(f(x, 1))
fmt.Println(f(x, 63))
}{}
Вопросы:
Что выведет код?
Что будет при β = 64?
Можно ли объявить одновременно beta и β?
Ожидаемый ответ:
1
2
1
Подвох:
сдвиг зависит от β
возможен отрицательный shift
обрезание до uint32
beta и β - разные переменные
• Вам нужно понять, как работает сдвиг вправо
заметить, что в конце результат режется до uint32
• увидеть, что при β = 64 получится отрицательный сдвиг:
63 - 64 = -1
и ещё понять, что beta и β в Go - это разные имена переменных
То есть с виду задача про один shift, а на деле она проверяет сразу несколько знаний.
Запустить код: https://go.dev/play/
Полезные ресурсы Go 🚀Max
@golangtests
func fillData(s []int, m map[string]int) {
// Добавляем в срез
s = append(s, 10, 20, 30)
// Добавляем в мапу
m["count"] = len(s)
m["total"] = 60
fmt.Println("Срез:", s)
fmt.Println("Мапа:", m)
}
func main() {
fillData(nil, nil)
}{}
💡 Подсказка: срез и мапа ведут себя по-разному
append к nil срезу работает нормально
запись в nil map → panic
🔥 В чём ошибка
m не инициализирована → это nil map
в неё нельзя записывать значенияОтзывы канала
всего 2 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Golang задачи и тесты — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 7.8K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 6.3, количество отзывов – 2, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 8251.74 ₽, а за 47 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий