package main
import (
"bufio"
"fmt"
"os"
"sync"
)
func main() {
urls := make(chan string)
go fillChannel(urls)
// создаем группу для ожидания, того, что все воркеры завершены
wg := &sync.WaitGroup{}
for i := 0; i < 5; i++ {
// при запуске каждого воркера, увеличиваем счетчик в группе на 1
wg.Add(1)
go requestWorker(urls, wg)
}
// ждем, пока счетчик в группе не будет равен 0
wg.Wait()
}
func requestWorker(channel <-chan string, wg *sync.WaitGroup) {
// По завершении воркера счетчик в группе будет уменьшен на 1
defer wg.Done()
// Заодно пишем сообщение о завершении воркера
defer println("Worker stopped")
// Постоянно читаем из канала новые сообщения
// цикл автоматически завершится, когда канал закроется и буфер будет пуст
for url := range channel {
println(url)
}
}
func fillChannel(channel chan<- string) {
file, err := os.Open("data.txt")
defer file.Close()
if err != nil {
fmt.Println(err)
return
}
fileScanner := bufio.NewScanner(file)
fileScanner.Split(bufio.ScanLines)
for fileScanner.Scan() {
channel <- fileScanner.Text()
}
// закрываем канал, когда данные кончились
// в го принято, чтобы канал закрывал только тот, кто в него пишет
close(channel)
}
cmd := exec.Command("python", "script.py")
stdoutBuf := bytes.NewBuffer(nil)
cmd.Stdout = stdoutBuf
if err := cmd.Run(); err != nil {
log.Println(err.Error())
}
fmt.Println(stdoutBuf.String())
cmd := exec.Command("python", "script.py")
res, err := cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(res))
package main
import (
"fmt"
"log"
)
func main() {
code := map[string]interface{}{
"test": "test",
}
// извлекаем interface{} из мапы внутри которого строка
ifaceStr := code["test"]
// извлекаем строку из interface{}
str, ok := ifaceStr.(string)
if !ok {
log.Fatal("it's not a string")
}
fmt.Println(str)
}
r.Handler("GET", "/", fServer)
r.Handler("GET", "/*filepath", fServer)
main redeclared in this block {строка 8 столбец 6 }
previous declaration at ./hello.go:18:6
path := `c:\Program files\some program\program.exe`
// аналогично вызову в консоли start "c:\Program files\some data"
cmd := exec.Command("start", path)
......
// аналогично вызову в консоли "c:\Program files\some program\program.exe"
cmd := exec.Command(path)
......
// аналогично вызову в консоли some_prog.exe -flag1 value1 -flag2 value2
cmd := exec.Command("some_prog.exe", "-flag1", "value1", "-flag2", "value2")
......
map[string][]func(string, interface{})
package main
import "fmt"
func main() {
var some = float64(5) / float64(3)
fmt.Println(some)
fmt.Printf("%T", some)
}