Практика Flashcards
Восстановление после паники
package main
import “fmt”
func main() { defer func() { fmt.Println("recovered:",recover()) }()
panic("not good") }
«Скрытые данные» в слайсах
При перенарезке получившийся слайс будет ссылаться на массив исходного слайса. Не забывайте об этом. Иначе может возникнуть непредсказуемое потребление памяти, когда приложение разместит в ней крупные временные слайсы и создаст из них новые, чтобы ссылаться на небольшие куски исходных данных.
package main
import “fmt”
func get() []byte { raw := make([]byte,10000) fmt.Println(len(raw),cap(raw),&raw[0]) // выводит: 10000 10000 res := make([]byte,3) copy(res,raw[:3]) return res }
func main() { data := get() fmt.Println(len(data),cap(data),&data[0]) // выводит: 3 3 }
«Повреждение» данных в слайсах
Решить проблему
package main
import (
“fmt”
“bytes”
)
func main() { //suffix path := []byte("AAAA/BBBBBBBBB") sepIndex := bytes.IndexByte(path,'/') dir1 := path[:sepIndex:sepIndex] // Лучше копировать, это неявное пересоздание слайса из-за капасити тут его делают равным количеству элементов, и при аппенд мы типа получаем новый слайс dir2 := path[sepIndex+1:] fmt.Println("dir1 =>",string(dir1)) // выводит: dir1 => AAAA fmt.Println("dir2 =>",string(dir2)) // выводит: dir2 => BBBBBBBBB
dir1 = append(dir1,”suffix”…)
path = bytes.Join([][]byte{dir1,dir2},[]byte{‘/’})
fmt. Println(“dir1 =>”,string(dir1)) // выводит: dir1 => AAAAsuffix
fmt. Println(“dir2 =>”,string(dir2)) // выводит: dir2 => uffixBBBB (not ok)
fmt.Println(“new path =>”,string(path))
}
Слить N каналов в один
Даны n каналов типа chan int. Надо написать функцию, которая смерджит все данные из этих каналов в один и вернет его.
Мы хотим, чтобы результат работы функции выглядел примерно так:
for num := range mergeChannels(a, b, c) {
fmt.Println(num)
}
package main
import (
“fmt”
“sync”
)
func gen(nums …int)
Select в каналах. Напиши код, который использует селект
stop
Select в каналах. Напиши код, который использует селект
Не самый крутой код, ввиду того, что нам нужно закрывать 2 горутины, а значит посылать 2 сообщения.
package main
import ( "fmt" "sync" "time" )
func gen(stop chan struct{})