✨Go语言基础面试题 I 第一弹

31 阅读4分钟

Go语言面试题 I 精油开背记录

1. 什么是 goroutines?

Goroutines 是 Go 语言中的轻量级线程,它们比传统操作系统线程更节省资源,单个线程内可以启动数千个 goroutines。

2. Goroutines和进程的区别?

Goroutine类似于轻量级的线程,可以在相同的地址空间中同时运行多个函数。与线程不同的是,Goroutine具有更小的堆栈大小和更快的启动时间,使得Go能够轻松地创建大量的并发任务。

3. 什么是内存泄漏?如何在 Go 中避免内存泄漏?

内存泄漏是指在程序运行过程中不再使用的内存没有被及时释放,从而导致内存空间的浪费。在Go中,可以通过垃圾回收机制来自动管理内存,并避免内存泄漏的问题。此外,还可以使用类似于RAII的资源管理方式,如使用defer语句释放资源、避免过多的全局变量等。

4. channel 是什么?你可以用 channel 做什么?

Channel是Go中用于在Goroutine之间传递数据的通信机制。 它是一种阻塞式的同步机制,用于在发送方和接收方之间进行数据传输。通过通道,可以确保Goroutine之间的同步和协作,避免数据竞争和死锁。

5. 请解释一下 Go 中的 defer 关键字的作用。

defer语句用于延迟函数的执行,直到当前函数返回之前执行。它通常用于在函数退出时清理资源或记录日志等操作。

7. Go 中的接口是什么?

接口是一组方法的集合,用于描述一个对象的行为。它规定了一个类型所必须实现的方法,如果一个类型定义了接口中的所有方法,那么该类型就被视为实现这个接口。

9. 嵌入类型在 Go 中的作用是什么?

嵌入类型是一种实现继承的方式,其中一个 struct 可以包含另一个 struct 作为它的一个成员。这样,包含 struct 上的方法可以使用嵌套 struct 的属性和方法,就像它自己的一样。

10. 如何理解 Go 中的 map 和 slice?

Map 是一种K-V的数据结构,类似于字典或哈希表。slice 是一种动态数组。 可以使用内置的 make() 函数创建 map 和 slice。

11. 请解释一下 Go 中的 “for-select” 模式。

for-select 模式在 for 循环中使用 select,这个模式可以用于 goroutines 之间的通信和同步,可以一直运行以等待 goroutines 并执行相应的操作。

12. 面向对象编程在 Go 中是如何实现的?请编写一个示例进行演示。

//声明一个结构体
type Person struct { 
	name string    
	age int 
} 
//GetSet方法
func (p *Person) GetName() string { 
	return p.name 
	} 
func (p *Person) SetName(name string) {
	p.name = name 
	} 
//主方法赋值去打印
func main() { p := &Person{
		name: "Bob", age: 30} p.SetName("John")  
		fmt.Println(p.GetName()) // 输出 John 
		}

13. 请解释一下 Go 中的错误处理方式。

在Go中,错误通常是通过返回值来传递的,常见的做法是在函数的返回值列表中添加一个error类型的变量,用于表示函数执行的结果是否正常。在调用函数时,通常需要对返回的错误值进行判断和处理,以保证程序的正确性和可靠性。。

14. 请解释一下 Go 中的反射机制,并提供示例用法。

反射机制允许程序在运行时检查和修改变量和类型信息。 反射主要通过 reflect 包提供接口来实现。例如,可以使用 reflect.TypeOf() 和 reflect.ValueOf() 函数获取变量的类型和值:

var x int = 10 
fmt.Println(reflect.TypeOf(x)) // 输出 "int" 
fmt.Println(reflect.ValueOf(x)) // 输出 "10"

15. 请解释一下 panic 和 recover。

panic和recover是Go语言中用于处理异常的机制。当程序出现无法处理的错误时,可以通过调用panic函数来触发异常,导致程序终止。在某些情况下,我们可能需要在程序终止前进行一些清理工作或记录异常信息等操作,这时可以使用recover函数来捕获异常并进行相应的处理。