go mod tidy
go env
в терминале. package main
import (
"fmt"
"sync"
"time"
)
const (
jobsNum = 5
workersNum = 2
)
type Job struct {
id int
}
func worker(id int, jobChan <-chan Job, wg *sync.WaitGroup) {
for job := range jobChan {
process(id, job, wg)
}
}
func process(id int, job Job, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Worker %d, Job start: %d\n", id, job.id)
time.Sleep(1 * time.Second)
fmt.Printf("Worker %d, Job end: %d\n", id, job.id)
}
func main() {
fmt.Println("Start")
jobChan := make(chan Job, 10)
var wg sync.WaitGroup
wg.Add(jobsNum)
// start the workers
for i := 0; i < workersNum; i++ {
go worker(i, jobChan, &wg)
}
// enqueue jobs
for i := 0; i < jobsNum; i++ {
jobChan <- Job{
id: i,
}
}
close(jobChan)
wg.Wait()
fmt.Println("Done")
}
Start
Worker 1, Job start: 1
Worker 0, Job start: 0
Worker 0, Job end: 0
Worker 0, Job start: 2
Worker 1, Job end: 1
Worker 1, Job start: 3
Worker 0, Job end: 2
Worker 0, Job start: 4
Worker 1, Job end: 3
Worker 0, Job end: 4
Done
func init()
gBot
. init
запускается автоматически при старте, но и-за опечатки этого не произошло.at c:/Users/hendr/Downloads/GoTelegramBot/main.go:32
WithValue
ctx := context.Background() // исходный контекст
ctx = context.WithValue(ctx, "foo1", "bar1") // переопределенный
ctx = context.WithValue(ctx, "foo2", "bar2") // переопределенный
app := NewApp()
app.Start()
func (a *App) Start() {
go listenGRPC()
go listenMQ()
}
в БД просто выборка строки по idНу, можно взять какую-то K/V СУБД.
scanner := bufio.NewScanner(os.Stdin)
scanner.Text()
вернёт токен с числом в строке.непонятной причине потоки (goroutines) сами по себе перестают выполняться.
go-web/cmd/goweb/main.go
go build -a -installsuffix cgo -o main go-web/cmd/goweb/main.go
COPY . .
полезно временно вставить команду RUN ls -la
. Соответственно, надо убедиться, что исполняя команды в рабочей директории, все файлы проекта находятся на своих местах. exec.Command
- это системный вызов с сопутствующим поиском исполняемого файла, его загрузкой в память и исполнением. Для повторного запуска количество шагов уменьшается.context.WithTimeout
и exec.CommandContext
.