После прочтения кода на Github, с которым вы связались, функция crawl()
принимает concurrentStorage
(не указатель).
Для каждой разыменования (то есть: *urlSet
) при вызовеcrawl()
, вы копируете структуру concurrentStorage
(включая sync.Mutex
), в то время как карта сохраняет указатель на оригинал.Это означает, что ваши мьютексы изолированы от каждой программы, пока они находятся в одном и том же состоянии.
Если вы измените crawl()
, чтобы вместо него принять указатель, и прекратите разыменовывать concurrentStorage
, он будет работать какВы намерены.