Практика Flashcards

1
Q

Восстановление после паники

A

package main

import “fmt”

func main() {  
    defer func() {
        fmt.Println("recovered:",recover())
    }()
panic("not good") }
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

«Скрытые данные» в слайсах

A

При перенарезке получившийся слайс будет ссылаться на массив исходного слайса. Не забывайте об этом. Иначе может возникнуть непредсказуемое потребление памяти, когда приложение разместит в ней крупные временные слайсы и создаст из них новые, чтобы ссылаться на небольшие куски исходных данных.

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 
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

«Повреждение» данных в слайсах

A

Решить проблему
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))
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Слить N каналов в один
Даны n каналов типа chan int. Надо написать функцию, которая смерджит все данные из этих каналов в один и вернет его.

Мы хотим, чтобы результат работы функции выглядел примерно так:

for num := range mergeChannels(a, b, c) {

   fmt.Println(num)

}

A

package main

import (
“fmt”
“sync”
)

func gen(nums …int)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Select в каналах. Напиши код, который использует селект

A

stop

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Select в каналах. Напиши код, который использует селект

A

Не самый крутой код, ввиду того, что нам нужно закрывать 2 горутины, а значит посылать 2 сообщения.
package main

import (
  "fmt"
  "sync"
  "time"
)

func gen(stop chan struct{})

How well did you know this?
1
Not at all
2
3
4
5
Perfectly