代码题 以n个协程,去输出[]string{“a”,“b”,“c”,“d”,“e”, “f”, “g”}。 代码题真得很简单,自己手生的很,竟然没写出来。
func main() { var wg sync.WaitGroup sem := make(chan struct{}, 5) // 创建一个大小为5的信号量 letters := []string{"a", "b", "c", "d", "e", "f", "g"} for _, letter := range letters { sem <- struct{}{} // 尝试写入信号量,如果已满,则阻塞 wg.Add(1) go func(l string) { defer wg.Done() fmt.Println(l) time.Sleep(5 * time.Second) <-sem // 认领信号量 }(letter) } wg.Wait() 八股文 go的map可不可以一边遍历,一边delete。为什么?怎么解决 在Go语言中,不能够同时遍历和修改(包括删除)map,因为在遍历过程中如果对map进行了修改或删除,会导致遍历结果不确定性,甚至会导致程序崩溃。
如果一边遍历一边删除map中的元素,会导致遍历器遍历到的元素和map中实际存在的元素不一致,可能会漏掉一些元素或者重复遍历某些元素,从而影响程序的正确性。 为了解决这个问题,可以采用以下方案:
遍历map时,将需要删除的key保存到一个slice中,然后遍历slice进行删除操作。
m := map[int]string{1:"a", 2:"b", 3:"c"} keys := make([]int, 0, len(m)) for k := range m { keys = append(keys, k) } for _, k := range keys { delete(m, k) } 使用并发安全的map,如sync....