Как уже упоминалось @peterSO, ошибка вызвана "fmt.Printf (" результат равен% v \ n ", t.data.d [" test "])".
После нескольких часов копания я, кажется, нашел ответы на свои первые два вопроса. Я неправильно понял концепцию мьютекса. Мьютекс используется для защиты ресурса, а не для блокировки самой памяти, в моем примере, самой структуры.
По первому вопросу:
если одна программа выполняет некоторый код, такой как
s.pingLock.Lock()
\\ some logic 1
s.pingLock.Unlock()
streamLock
\\ some logic 2
streamUnlock
Таким образом, когда одна подпрограмма выполняет этот код и получает s.streamLock.Lock()
, пока она не будет разблокирована, другие подпрограммы go не могут выполнить some logic 2
, но любая подпрограмма может выполнить some logic1
, если она получает pingLock.Lock()
. Если используется только одна блокировка, если одна подпрограмма go получает блокировку, никто другой не может получить блокировку, тогда все другие выполнения блокируются.
По второму вопросу:
Если понимание объяснения выше. Тогда ответ на второй вопрос тоже. Размещайте mutex где угодно, потому что это просто блокировка для защиты ресурса, то есть самого кода. Я уверен, что есть хороший идиоматический способ сделать это.
Я не уверен, правильно ли так поступать. Если у кого-то другое мнение или лучший ответ, пожалуйста, дайте мне знать.