栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Golang延迟澄清

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang延迟澄清

它取决于方法的接收者 变量的类型。

简短的答案:如果您使用的是

database/sql
包,则延迟的
Rows.Close()
方法将正确关闭两个
Rows
实例,因为它们
Rows.Close()
具有
指针 接收器, 并且
由于
DB.Query()
返回了 指针指针
也是如此
rows
)。请参阅下面的推理和解释。


为避免混淆,我建议使用不同的变量,这样会清楚您 想要 什么以及 将要 关闭的内容:

rows := Query(`SELECt FROM whatever`)defer rows.Close()// ...rows2 := Query(`SELECt FROM whatever`)defer rows2.Close()

我想指出一个重要的事实,它来自于deferred函数及其参数被立即评估,这在Effective
Go博客文章和Language
Spec:Deferred语句中也有说明:

每次执行“ defer”语句时,将照常评估调用的函数值和参数并 重新保存,
但不会调用实际函数。而是,在周围的函数返回之前,立即以延迟的相反顺序调用延迟的函数。

如果变量不是指针: 调用延迟的方法时,您会观察到不同的结果,具体取决于该方法是否具有指针接收器。
如果变量是指针,您将始终看到“所需”结果。

请参阅以下示例:

type X struct {    S string}func (x X) Close() {    fmt.Println("Value-Closing", x.S)}func (x *X) CloseP() {    fmt.Println("Pointer-Closing", x.S)}func main() {    x := X{"Value-X First"}    defer x.Close()    x = X{"Value-X Second"}    defer x.Close()    x2 := X{"Value-X2 First"}    defer x2.CloseP()    x2 = X{"Value-X2 Second"}    defer x2.CloseP()    xp := &X{"Pointer-X First"}    defer xp.Close()    xp = &X{"Pointer-X Second"}    defer xp.Close()    xp2 := &X{"Pointer-X2 First"}    defer xp2.CloseP()    xp2 = &X{"Pointer-X2 Second"}    defer xp2.CloseP()}

输出:

Pointer-Closing Pointer-X2 SecondPointer-Closing Pointer-X2 FirstValue-Closing Pointer-X SecondValue-Closing Pointer-X FirstPointer-Closing Value-X2 SecondPointer-Closing Value-X2 SecondValue-Closing Value-X SecondValue-Closing Value-X First

在Go Playground上尝试一下。

使用指针变量,结果始终是好的(如预期的那样)。

使用非指针变量和指针接收器,我们可以看到相同的打印结果(最新的),但是如果我们有值接收器,它将打印2个不同的结果。

非指针变量的说明:

如前所述,

defer
执行时会评估包括接收器在内的延迟功能。如果是指针接收器,它将是 局部变量地址
。因此,当您给它分配一个新值并调用另一个值时
defer
,指针接收器将再次成为局部变量的 相同地址
(只是指向的值不同)。因此,稍后在执行该函数时,两个都将使用相同的地址两次,但 指向的 值将是相同的,后面将分配一个。

对于值接收器,接收器是在执行时创建的
副本

defer
,因此,如果将新值分配给变量并调用另一个值,则将创建
defer
另一个副本,该副本与先前的副本不同。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/471181.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号