Go中有什么与init()
包装内部的功能相反吗?
Go团队之前已经讨论过这一点,结论是不增加对此的支持。报价minux:
就个人而言,我更喜欢程序退出与程序崩溃完全相同的处理方式。我相信,无论您多么努力,程序在某些无法预料的情况下仍然可能崩溃;例如,内存不足会导致任何性能良好的Go程序崩溃,而您对此无能为力。因此最好为他们设计。如果您遵循此步骤,您将不会感觉到需要清理atexit(因为当程序崩溃时,atexit无法正常工作,因此您根本无法依赖它)。
但是您仍然有一些选择:
CTRL+C
如果您想在用CTRL+C
(SIGINT)终止程序时执行某些操作。
还要注意,您可以为指针值注册一个终结器函数。当垃圾收集器找到带有关联的终结器的无法访问的块时,它将清除该关联并f(x)
在单独的goroutine中运行。
您可以注册这样的终结器runtime.SetFinalizer()
,可能足以满足您的需要,但请注意:
无法保证终结器会在程序退出之前运行,因此通常它们仅对在长时间运行的程序期间释放与对象关联的非内存资源有用。
请参阅以下示例:
type Person struct {
Name string
Age int
}
func main() {
go func() {
p := &Person{"Bob", 20}
runtime.SetFinalizer(p, func(p2 *Person) {
log.Println("Finalizing", p2)
})
runtime.GC()
}()
time.Sleep(time.Second * 1)
log.Println("Done")
}
输出(转到游乐场):
2009/11/10 23:00:00 Finalizing &{Bob 20}
2009/11/10 23:00:01 Done
问题内容: 从2010年的计算机语言基准游戏中可以看出: Go平均比C慢10倍 Go比Java慢3倍! 考虑到Go编译器会生成要执行的本机代码,这怎么可能? Go的编译器不成熟?还是Go语言存在一些内在问题? 编辑: 大多数答案否认Go语言的内在缓慢,声称问题出在不成熟的编译器中。 因此,我进行了一些自己的测试来计算斐波那契数:迭代算法在Go(freebsd,6g)中以与C(带有O3选项)一样的速
final可以修饰类,变量,方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写 finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭。 finalize方法用于垃圾回收。 一般情况下不需要我们实现finalize,当对象被回收的时候需要释放一些资源,比如socket链接,在对象初始化时创建,整个生命周期内有效,那么需
问题内容: 我是Go编程语言的新手。 我注意到Go中有一些奇怪的地方:我认为它在Python中使用并替代了,但是当我在Go中使用时,它也是可行的。 和之间有什么区别? 问题答案: 是分配。有关Go中分配的更多信息:分配 和在变量声明中使用时的细微差别。 Go中变量声明的一般形式是: 上面的声明创建一个特定类型的变量,为其添加名称,并设置其初始值。 无论是或可以省略,但不能同时使用。 例如: 被称为
问题内容: 因此,今天在编码时,我发现使用该名称创建函数会产生错误,但是当我将其重命名为所有功能时,一切正常。 是为了在Go中进行某些内部操作而保留“ init”一词,还是我在这里丢失了一些东西? 问题答案: 是的,功能很特殊。加载程序包时,它将自动执行。甚至该程序包也可能包含一个或多个在实际程序开始之前执行的功能:http : //golang.org/doc/effective_go.html
问题内容: 我了解Go中数组和切片之间的区别。但是我不明白的是为什么完全拥有数组会有所帮助。数组类型定义指定长度和元素类型为什么有帮助?为什么我们使用的每个“数组”都不能切片? 问题答案: 数组不仅仅是固定长度,还有更多:它们是 可比较的 ,并且它们是 值 (不是引用或指针类型)。 在某些情况下,数组比切片有无数的优势,所有这些优点加在一起证明了数组的存在(以及切片)。让我们看看他们。(我什至不算