学习golang,这条路仍然很长。我仍然记得,当我第一次开始学习Golang时,写作真的很简单。有很多包装和工具可以使用。
Golang天生就很高,并且在编码时,将滥用Goroutine。让我们看看它是如何被滥用的。
XDM查看上面的简单程序运行GO运行main.go输出?
它会输出0到9吗?让我们看一下效果
哦,为什么是这样,它清楚地散发了10次,结果应在每次1时打印出来。
实际上,我们看到的这种现象属于并发错误
我们尝试通过匿名函数传递参数i,以查看效果是否会更好
再次执行输出
果然,这是我们想要的结果
然后回顾代码,我们可以发现我是主要关联中的变量。阅读i的值不断导致并发错误
避免使用此并发症错误,您可以使用上面使用的参数副本。
让我们确认我的地址是否一直相同
该程序正在运行如下。主要的coroutine是相同的i,地址完全相同。
让我们看一下解决错误时i地址之间的区别。
我们可以看到,主关联中我地址的地址仍然相同,这是正确的,但是sub -coroutine中每个coroutine中每个coroutine的i变量地址不同。变量i,因此上面没有上述错误
有时,当我们编码时,我们会打开多个Coroutines,但是可能会在Coroutine中感到恐慌。
举一个简单的例子
上面的程序很明显,令人恐慌,删除0是一个例外。可以想象,由于Sub -Coroutine的恐慌
运行程序后,错误消息如下:
我们将处理是否在每个子核心出口之前会出现恐慌,因此Sub -Coroutine的恐慌不会导致主要的Coroutine挂断。在这里记住
程序运行效果如下:
显然,该程序并非没有恐慌,因为处理了每个子库中发生的恐慌。我们还可以使用Golang提供的运行时包来打印特定的恐慌信息以促进问题的分析
让我们写一个简单的例子
在这里,我们使用它来计算Goroutine Panic的堆栈信息的字节数,最后打印
让我们先看一下效果
我们打印出恐慌堆栈信息的字节数量,并打印出恐慌的特定信息。最重要的是该程序不会崩溃
通过使用上述方法,您可以使Sub -Coroutine的恐慌不会影响主coroutine。
您可以看到对功能功能的解释。
堆栈调用Goroutine的堆栈跟踪格式化为BUF,并返回写入BUF的字节数。
如果为true,堆栈将在当前的Goroutine跟踪和输入BUF之后格式化所有其他Goroutine堆栈跟踪。
Golang有很多技能。我们需要使用它来反映其价值。