golang book 11

можно откладывать только вызовы функций или методов получение списка файлов в каталоге package main import ( "fmt" "io/ioutil" "log" ) func main() { files, err := ioutil.ReadDir("./") if err != nil { log.Fatal(err) } for _, file := range files { if file.IsDir() { fmt.Println("Dir ", file.Name()) } else { fmt.Println("File ", file.Name()) } } } циклы быстрее рекурсии! рекурсия showDirRecurses.go package main import ( "fmt" "io/ioutil" "log" ) func showAllFiles(way string) { files, err := ioutil.ReadDir(way) if err != nil { log.Fatal(err) } for _, file := range files { if file.IsDir() { showAllFiles(way + "/" + file.Name> //fmt.Println("Dir ", file.Name()) } else { fmt.Println("File ", file.Name()) } } } func main() { showAllFiles("./") } другой метод соединения path/filepath filePath := filepath.Join(path, file.Name()) для авариного завершения panic("aaaaaa") 399 функция паники покажет путь к ней по функциям recover() восстановиться выводит текст ошибки и забивает на панику package main import "fmt" func regen() { fmt.Println(recover()) } func freak() { defer regen() // Обязательно в другой функции! panic("aaaa") } func main() { freak() fmt.Println("text") } Лучше пользоваться обработкой ошибок, чем этмми исключениями паник.. горутины расходуют меньше памяти, чем потоки они конкурируют меж собой, кто свободен, тот и берет задачу 413 читаем веб страницу package main import ( "fmt" "io/ioutil" "log" "net/http" ) func main() { response, err := http.Get("https://h7team.ru") if err != nil { log.Fatal(err) } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body)) fmt.Println(len(body)) } документация go doc http Get go перед функцией или методом ставит ее паралельно остановка временно time.Sleep(time.Second * 60) минута package main import ( "fmt" "time" ) func manyPrint(str string, quantity int) { for i := 0; i < quantity; i++ { fmt.Print(str) } } func main() { go manyPrint("0", 50) go manyPrint("1", 50) manyPrint("2", 100) time.Sleep(time.Second * 5) } 222222222222222 110001111000011 Каналы Для контроля порядка горутин и передача данных от одной го рутины другой подобие колбэки горутины не могут возвращать значения подобие асинхронности в js var myChannel chan float64 myChannel = make(chan float64) или myChannel := make(chan float64) func send(myChanel chan string) { myChannel <- "hi" } func main() { myChannel := make(chan float64) go send(myChannel) fmt.PrintLn(<-myChannel) } 425 package main import ( "fmt" ) func abc(channel chan string) { channel <- "a" channel <- "b" channel <- "c" } func def(channel chan string) { channel <- "d" channel <- "e" channel <- "f" } func main() { channel1 := make(chan string) channel2 := make(chan string) go abc(channel1) go def(channel2) fmt.Print(<-channel1) fmt.Print(<-channel2) fmt.Print(<-channel1) fmt.Print(<-channel2) fmt.Print(<-channel1) fmt.Print(<-channel2) } есл отправка нескольких данных из горутины, то вторая блокируется до тех пор пока первая ее не спрашивает, когда первая спрашивает, тогда вторая начинает заниматься грубо если не просит, то вторая и не делает package main import ( "fmt" "time" ) func wait(name string, delay int) { for i := 0; i < delay; i++ { fmt.Println(name, " sleep") time.Sleep(time.Second) } } func send(channel chan string) { wait("send", 3) fmt.Println("val1") channel <- "a" fmt.Println("val2") channel <- "b" } func main() { channel := make(chan string) go send(channel) wait("main", 5) fmt.Println(<-channel) fmt.Println("podumai") fmt.Println(<-channel) } main sleep send sleep main sleep send sleep send sleep main sleep val1 main sleep main sleep a podumai val2 b Как бы второй ответ начинает создаваться только тогда, когда был выполнен первый видимо он не создается, когда канал занят первым package main import ( "fmt" "time" ) func wait(name string, delay int) { for i := 0; i < delay; i++ { fmt.Println(name, " work") time.Sleep(time.Second) } } func send(channel chan string) { wait("rab", 3) fmt.Println("val1") channel <- "a" wait("rab", 15) fmt.Println("val2") channel <- "b" } func main() { channel := make(chan string) go send(channel) wait("bos", 10) fmt.Println(<-channel) fmt.Println("obed") wait("bos", 8) fmt.Println(<-channel) fmt.Println("to home") } 427 GNU nano 7.2 rutinSizeSite.go package main import ( "fmt" "io/ioutil" "log" "net/http" ) func responseSize(url string, channel chan int) { fmt.Println("Get ", url) responce, err := http.Get(url) if err != nil { log.Fatal(err) } defer responce.Body.Close() body, err := ioutil.ReadAll(responce.Body) if err != nil { log.Fatal(err) } channel <- len(body) } func main() { sizes := make(chan int) urls := []string{ "https://h7team.ru", "https://google.com", "https://ya.ru", } for _, url := range urls { go responseSize(url, sizes) } for i := 0; i < len(urls); i++ { fmt.Println(<-sizes) } } 431