
- Главная
- Каталог
- Интернет технологии
- Golang задачи и тесты
Статистика канала
Полная статистикаchevron_right
package main
import "fmt"
func main() {
s := []int{1, 2, 3, 4}
t := s[:2] // [1 2]
u := s[2:] // [3 4]
// Изменяем через t
t = append(t, 9)
// Изменяем через u
u[0] = 99
fmt.Println("s:", s)
fmt.Println("t:", t)
fmt.Println("u:", u)
}
{}
🔥 Разбор
t := s[:2] и u := s[2:] смотрят на один и тот же underlying array
но append(t, 9) может либо
• дописать в тот же массив, либо
• выделить новый, если capacity закончилась
Именно тут начинается путаница:
если capacity исходного s >= 5 — append изменит исходный массив, и s, t, u будут видеть изменения друг друга
если capacity = 4 — append создаст новый backing array, и t “оторвётся” от s и u
То есть вывод зависит от capacity, а её большинство разработчиков не проверяют, но предполагают.
✔️ Добавим интриги — сделай capacity явной 👇
s := make([]int, 4, 4) // capacity = length
copy(s, []int{1,2,3,4})
Теперь:
- append(t, 9) создаёт новый массив
и t уже не связан с s
Вывод будет:
```
s: [1 2 99 4]
t: [1 2 9]
u: [99 4]
```
Но если capacity увеличить:
```go
s := make([]int, 4, 10) // capacity > length
copy(s, []int{1,2,3,4})
```
Мы получим:
```
s: [1 2 9 99]
t: [1 2 9]
u: [99 4]
```
Потому что в этот раз append записал в тот же underlying array.
В Go поведение slice зависит от capacity --и два, казалось бы, одинаковых куска кода могут работать по-разному без единой строки изменения.
👉 Запустить код
package main
import (
"fmt"
)
type S struct {
v int
}
func (s S) Value() int {
return s.v
}
type I interface {
Value() int
}
func mutate(i I) {
// Мы думаем, что меняем реальный объект...
if s, ok := i.(S); ok {
s.v = 100
}
}
func main() {
s := S{v: 10}
var i I = s
mutate(i)
fmt.Println(s.v) // ???
fmt.Println(i.Value()) // ???
}
{}
Всё выглядит так:
Мы передаём объект в mutate → внутри меняем → значения должны измениться.
Тут ловушка в том, что:
- интерфейсы в Go копируют значение, если оно не pointer receiver
- type assertion s, ok := i.(S) создаёт новую копию
- мы мутируем копию, а не оригинал
Так что вывод будет:
10
10
А не 100.
👉 Запустить код
package main
import "fmt"
func main() {
s := []int{1, 2, 3}
t := s // t и s смотрят на один и тот же массив
u := append(s, 4)
s[0] = 99 // меняем через s
t = append(t, 5)
fmt.Println("s:", s)
fmt.Println("t:", t)
fmt.Println("u:", u)
}
{}
Ответ:
s: [99 2 3]
t: [99 2 3 5]
u: [1 2 3 4]
Дополнительные Вопросы : Где именно произойдёт перераспределение массива, какие срезы продолжат делить общую память, а какие уже нет — в этом и фокус задачи
👉Запустить код - https://go.dev/play/p/M_JvkzNmVY9
@golangtests
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
for i := 0; i < 5; i++ {
go func(id int) {
for {
fmt.Println("goroutine", id, "работает на потоке")
time.Sleep(200 * time.Millisecond)
}
}(i)
}
for {
fmt.Println("горутин сейчас:", runtime.NumGoroutine())
time.Sleep(time.Second)
}
}{}
https://www.youtube.com/shorts/XQmGO29JE7w
#junior #golang
package main
import "fmt"
func binSearch(a []int, t int) bool {
l, r := 0, len(a)-1
for l <= r {
m := (l + r) / 2
if a[m] == t { return true }
if a[m] < t { l = m + 1 } else { r = m - 1 }
}
return false
}
func main() {
nums := []int{1,4,7,9,15,20,33,42}
fmt.Println(binSearch(nums, 33))
fmt.Println(binSearch(nums, 100))
}{}
package main
import (
"errors"
"fmt"
)
type myError struct{}
func (m *myError) Error() string {
return "something went wrong"
}
func returnsNilError() error {
var e *myError = nil
return e
}
func main() {
err := returnsNilError()
fmt.Println("err == nil:", err == nil) // неожиданно false
fmt.Println("err:", err)
}{}
Вывод: err == nil: false
err: something went wrong
⚡️ Заплатить код: https://go.dev/play/p/lrw5DEthEvS
package main
import "fmt"
func main() {
s := []int{1, 2, 3, 4}
t := s[1:3] // t = [2, 3]
t = append(t, 99) // возможно, меняет s[3]
s[2] = 42 // изменяем s напрямую
fmt.Println("s:", s)
fmt.Println("t:", t)
}
{}
Ответ :
s: [1 2 42 99]
t: [2 42 99]
⚡️ Запустить код: https://go.dev/play/p/96RGE1ea6SqОтзывы канала
всего 2 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Golang задачи и тесты — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 7.8K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 22.4, количество отзывов – 2, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 8251.74 ₽, а за 46 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий