Go 语言中常见的坑
来源:http://www.tudoupe.com时间:2022-08-02
这里填写标题
- 1.Go语言中的常见问题
- 1.1.变量参数是空接口类型
- 1.2.集合是一个值转移
- 1.3.地图没有序列
- 1.4.返回值被封锁
- 1.5. recover 必须在 defer 函数中运行
- 1.6.主要功能提前退出
- 1.7. 通过 Sleep 来回避并发中的问题
- 1.8. 占领 CPU 导致 其他 Goroutine 的 饥饿 。
- 1.9. 不同 Goroutine 之间不满足顺序一致性内存模型
- 1.10.关闭错误引用相同的变量
- 1.11.在循环中执行延迟条款
- 1.12.切断将导致整个底部组被锁定
- 1.13.空指针与空接口之间的不平等
- 1.14.内存地址将更改
- 1.15.戈鲁丁泄漏
1.Go语言中的常见问题
这里列出的Go语言的常见漏洞与Go语言语法相一致,通常可以编译,但可能有运行失败的错误或资源泄漏的风险。
1.1.变量参数是空接口类型
当参数的变量参数是空接口类型时,在传递空接口切口时,必须注意参数扩展问题。
不管是否展开,编译器都无法发现错误,但是输出是不同的:
1.2.集合是一个值转移
在函数调用参数中,群是一个值转移,不能通过修改群类型的参数返回结果。
必要时需要剪纸。
1.3.地图没有序列
映射是一个 Hash 表的实现, 每个过渡的顺序可能不同.
1.4.返回值被封锁
在本地域中,一个与命名返回值相同的名称保护的本地变量:
1.5. recover 必须在 defer 函数中运行
恢复获取了祖父级调用例外,当直接调用时无效:
直接延迟调用也是无效的:
延迟调用时,多层嵌入仍然无效:
直接调用延迟函数必须有效:
1.6.主要功能提前退出
戈洛廷无法保证任务的完成。
1.7. 通过 Sleep 来回避并发中的问题
睡眠不能保证一个完整的字符串的输出:
同样,通过插入一个呼叫语句:
1.8. 占领 CPU 导致 其他 Goroutine 的 饥饿 。
Goroutine是一个协作的抓捕调用,而 Goroutine本身不会放弃CPU:
解决办法是将运行时间添加到for cycle.Gosched()调用函数中:
或者通过封锁避免CPU占用:
1.9. 不同 Goroutine 之间不满足顺序一致性内存模型
因为在不同的 Goroutine, main 函数中无法保证能打印出 hello, world:
解决办法是使用明确的同步:
msg 的写入是在 channel 发送之前,所以能保证打印hello, world
1.10.关闭错误引用相同的变量
改进的方法是在每个迭代中生成一个局部变量:
或者通过函数参数:
1.11.在循环中执行延迟条款
defer 在函数退出时才能执行,在 for 执行 defer 会导致资源延迟释放:
解决的方法可以在 for 中构造一个局部函数,在局部函数内部执行 defer:
1.12.切断将导致整个底部组被锁定
切断将导致整个子集被锁定,子集无法释放内存。 如果底部组较大,则对内存会产生很大的压力。
解决办法是克隆一个结果,以便释放一些基本群:
1.13.空指针与空接口之间的不平等
例如,返回一个错误指针,但不返回一个空错误接口:
1.14.内存地址将更改
对象的地址可能在Go语言中发生变化,所以指针不能从其他非指针类型的值中生成:
当内存发送更改时,相关的指针会同步更新,但非指针类型uintptr不会同步更新。
同样, Go对象地址不能存储在CGO中。
1.15.戈鲁丁泄漏
Go 语言是带内存自动回收的特性,因此内存一般不会泄漏。但是 Goroutine 确存在泄漏的情况,同时泄漏的 Goroutine 引用的内存同样无法被回收。
上面的程序中后台 Goroutine 向管道输入自然数序列,main 函数中输出序列。但是当 break 跳出 for 循环的时候,后台 Goroutine 就处于无法被回收的状态了。
我们可以通过上下文包来避免这个问题:
当 main 函数在 break 跳出循环时,通过调用 cancel() 来通知后台 Goroutine 退出,这样就避免了 Goroutine 的泄漏。
相关新闻
- 2023-04-16 2台电脑怎么共享(2台电脑怎么共享
- 2023-04-16 主板检测卡代码(电脑主板检测卡代
- 2023-04-16 dnf未响应(dnf未响应老是上不去)
- 2023-04-16 ppoe(pppoe拨号上网)
- 2023-04-16 网速不稳定(网速不稳定是路由器的
- 2023-04-16 wds状态(Wds状态成功)
- 2023-04-16 光标键(光标键不动了怎么办)
- 2023-04-16 电脑提速(电脑提速100倍的方法)
- 2023-04-16 切换用户(切换用户怎么切换回来
- 2023-04-16 数据包是什么(产品数据包是什么
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
