cmd := exec.Command("go", "build", ".")
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "GOOS=windows")
func start() {
file, _ := os.ReadFile("./data.txt")
for _, i := range strings.Split(string(file), "\n") {
select {
case <-stop:
return
default:
http.Get(Url + i)
}
}
}
package main
import (
"context"
"errors"
"io/ioutil"
"net/http"
"strings"
)
func start() {
file, _ := os.ReadFile("./data.txt")
ctx, cancel := context.WithCancel(context.Background())
defer cancel() // контекст обязательно надо отменять в конце
go func() {
select {
// Отменяем контекст при получении стоп-сигнала
case <-stop:
cancel()
// чтобы горутина завершилась по отмене контекста даже если stop не будет
case <-ctx.Done():
}
}()
for _, i := range strings.Split(string(file), "\n") {
err := processUrl(ctx, Url+i)
if err != nil {
if errors.Is(err, context.Canceled) {
return
}
// обработать ошибку
}
}
}
func processUrl(ctx context.Context, finalUrl string) error {
req, err := http.NewRequestWithContext(ctx, "GET", finalUrl, nil)
if err != nil {
return err
}
res, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer res.Body.Close() // обязательно, иначе будет утечка
// обработать ответ
return nil
}
package main
func main() {
var str strType
str.Temp()
}
type strType string
func (s strType) Temp() {
}
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))
add 2
, тогда мы применим только первый аргумент функции. Когда мы так делаем, на выходе получаем функцию с одним аргументом, потому что первый аргумент уже равен 2. Можете считать, что он просто сохранен внутри этой функции, чтобы быть использованным, когда функция будет полностью применена.Что вообще происходит в теле возвращаемой функции?
func main() {
fmt.Println(sum(1, 2))
carried := carry(sum, 1)
fmt.Println(carried(2))
}
func sum(a, b int) int {
return a + b
}
func carry(fn func(int, int) int, a int) func(int) int {
return func(b int) int {
return fn(a, b)
}
}