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