Пробую работу с горутинами, но вылезает дедлок
package main
import (
"bufio"
"fmt"
"os"
"strings"
"sync"
add "github.com/XRS0/gitHelper/internal/handlers/add"
commit "github.com/XRS0/gitHelper/internal/handlers/commit"
)
func main() {
Init()
reader := bufio.NewReader(os.Stdin)
text, err := reader.ReadString('\n')
if err != nil {
fmt.Println("Error reading data:", err)
return
}
fmt.Printf("Commands executed: \n")
cmds := strings.Split(text, " ")
printCommands(cmds)
rangeCommands(cmds)
}
func Init() {
flag := "ɢɪᴛHᴇʟᴘᴇʀ"
fmt.Println(flag)
}
func printCommands(commands []string) {
if len(commands) == 0 {
return
}
for _, word := range commands {
fmt.Printf("%s\n", word)
}
}
func rangeCommands(commands []string) {
if len(commands) == 0 {
return
}
// var arrayFunc []func()
var wg sync.WaitGroup
wg.Add(len(commands))
for _, word := range commands {
switch word {
case "commit":
go commit.GitCommitWithMessage(&wg)
// arrayFunc = append(arrayFunc, func() {
// commit.GitCommitWithMessage(&wg)
// })
case "add":
go add.GitAdd(&wg)
// arrayFunc = append(arrayFunc, func() {
// add.GitAdd(&wg)
// })
}
}
// for _, fn := range arrayFunc {
// go func(f func()) {
// f()
// }(fn)
// }
wg.Wait()
}
// file, err := os.Create("data.txt")
// reader := bufio.NewReader(os.Stdin)
// input, err := reader.ReadString('\n')
// _, err = file.WriteString(input)
// file, err := os.Create("data.txt")
// fmt.Printf("combined out:\n%s\n", string(out))
// out, err := cmd.CombinedOutput()
func GitCommitWithMessage(wg *sync.WaitGroup) error {
defer wg.Done()
fmt.Printf("Enter a commit name:\n")
reader := bufio.NewReader(os.Stdin)
text, err := reader.ReadString('\n')
if err != nil {
log.Fatal("Ошибка при чтении данных:", err)
}
fullCmd := fmt.Sprintf(`git commit -m "%s"`, text)
cmd := exec.Command(fullCmd)
err = cmd.Run()
if err != nil {
return err
}
return nil
}
func GitAdd(wg *sync.WaitGroup) error {
defer wg.Done()
fmt.Printf("Enter a commit name:\n")
reader := bufio.NewReader(os.Stdin)
text, err := reader.ReadString('\n')
if err != nil {
return err
}
cmd := exec.Command("git", "add", text)
err = cmd.Run()
if err != nil {
return err
}
return nil
}
Ответы (1 шт):
Автор решения: Collapse
→ Ссылка
Deadlock обычно возникает из-за взаимоблокировки горутин.
Вызывать в горутине подобное reader := bufio.NewReader(os.Stdin)
очень плохая практика, os.Stdin
является общим ресурсом и Вы из N горутин пытаетесь с ним взаимодействовать