Go基础面试题, Go 语言中打印字符串时,%v 和 %+v 有什么区别?
Go基础面试题, Go 语言中打印字符串时,%v 和 %+v 有什么区别?
QA
Step 1
Q:: Go 语言中打印字符串时,%v 和 %+
v 有什么区别?
A:: 在 Go 语言中,%v 和 %+v 都是用于格式化输出的占位符。%v 会以一种默认的格式输出变量的值,而 %+
v 则在输出结构体时,会包含字段名和字段值。例如,如果有一个结构体 type Person struct { Name string; Age int }
,使用 %v 输出时会显示 {John 30}
,而使用 %+
v 则会显示 {Name:John Age:30}
。
Step 2
Q:: 如何用 Go 语言实现一个线程安全的计数器?
A:: 在 Go 语言中,可以使用 sync.Mutex 或 sync/atomic 包来实现线程安全的计数器。使用 sync.Mutex 的方法是将一个计数器变量与互斥锁绑定,每次更新计数器时先锁定互斥锁,操作完成后再解锁。使用 sync/atomic 包的 atomic.AddInt64()
函数可以无锁地对计数器进行原子操作。
Step 3
Q:: Go 语言中的 goroutine 和线程有什么区别?
A:: Goroutine 是 Go 语言中的轻量级线程,它由 Go 运行时管理,而不是由操作系统管理。与操作系统线程相比,goroutine 的启动和切换开销更小,因此可以在同一时间运行大量 goroutine。Goroutine 的数量通常可以远超系统的线程数量,这使得 Go 语言非常适合用于构建并发应用程序。
Step 4
Q:: Go 语言中的 defer 语句如何工作?
A:: defer 语句用于在函数返回前执行一段代码。defer 语句注册的代码会在函数即将返回时按注册顺序的相反顺序执行。这通常用于资源清理,比如关闭文件或解锁互斥锁。在实际使用中,如果有多个 defer 语句,它们会以后进先出的顺序执行。
Step 5
Q:: Go 语言中的 interface{}
有什么作用?
A:: interface{} 是 Go 语言中所有类型的通用类型,类似于其他语言中的 'any' 或 'object'。它可以保存任何值,因为所有类型都实现了空接口。interface{}
常用于需要处理不同类型的值或与反射结合的情况下。