@markinaras

Как создать переменую областью видимости пакета,чтобы не видели другие горутины и без их блокировки?

Есть два пакета. В первом (main) запускаю n-количество горутин. Горутины работают со вторым пакетом,где есть переменая общей видимости и хоть горутины никак между собой не связаны вторым пакетом, но эту переменую они используют как общую. Как этого избежать,не применяя блокировку?

package main

import (
	"sync"
	"pkg2"
)
var wg sync.WaitGroup

func main() {
	text:=[]string{"a1","a2","a3","a4","a5"}
	for i,str:=range text{
		wg.Add(1)
		go start(str)
	}
	wg.Wait()
}

func start(str string){
	pkg2.Test(str)
	wg.Done()
}


package pkg2
import "fmt"

var str2 []string  // Переменная которую видят все горутины

func Test(str string){
	str2=append(str2,str)
	fmt.Printf("str:%v %v \n",str,str2)
}


Результат:
str:a2 [a2]
str:a1 [a1]
str:a5 [a1 a5]
str:a3 [a1 a5 a3]
str:a4 [a1 a5 a3 a4]

Нужно,чтобы было:
str:a2 [a2]
str:a1 [a1]
str:a5 [a5]
str:a3 [a3]
str:a4 [a4]
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Можно сделать что-то тапа такого.
Реализация не очень красивая, но, думаю, это даст вам понимание в каком направлении можно двигаться.
package pkg2
import "fmt"

type Pkg2 struct {
     str2 []string
}

func New() *Pkg2 {
    return &Pkg2{
        str2: []string{},
    }
}

func (p *Pkg2) Test(str string){
    p.str2 = append(p.str2, str)
    fmt.Printf("str:%v %v \n", str, p.str2)
}


package main

import (
  "sync"
  "pkg2"
)
var wg sync.WaitGroup

func main() {
  text:=[]string{"a1", "a2", "a3", "a4", "a5"}
  for i,str:=range text{
    wg.Add(1)
    p := pkg2.New()
    go start(str, p)
  }
  wg.Wait()
}

func start(str string, p *pkg2.Pkg2){
    p.Test(str)
    wg.Done()
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 мая 2022, в 00:48
3000 руб./за проект
18 мая 2022, в 00:31
100000 руб./за проект
18 мая 2022, в 00:09
15000 руб./за проект