1.什么是goroutine?它和线程有什么区别?
答:goroutine是Go语言中一种轻量级的线程,由Go语言的运行时系统调度。和线程不同的是,一个程序可以创建成千上万的goroutine,因为goroutine是在一个线程中运行的,所以创建goroutine的代价非常小。此外,goroutine之间的通信是通过通道来完成的,而不是共享内存,因此可以避免共享内存的同步问题。
2.什么是通道(channel)?它的作用是什么?如何创建一个通道?
答:通道(channel)是一种在多个goroutine之间进行通信的机制,它提供了同步和通信的功能。通过通道,一个goroutine可以向另一个goroutine发送数据,并且另一个goroutine可以从通道中接收数据。通道的创建方式是使用make函数,如:ch := make(chan int)。
3.什么是切片(slice)?它和数组有什么区别?如何创建和操作切片?
答:切片(slice)是一个动态数组,可以在运行时自动扩容。切片和数组的主要区别在于,切片的长度是可变的,而数组的长度是固定的。创建切片的方式是使用make函数或者通过切片表达式进行创建。切片可以使用索引和切片表达式进行操作,如:s[1:3]表示从切片s中取出下标为1到下标为2的元素。
4.什么是map?如何创建和操作map?如何在map中删除键值对?
答:map是一种哈希表,用于存储键值对。map中的键是唯一的,而值可以重复。创建map的方式是使用make函数,如:m := make(map[string]int)。可以使用索引和delete函数来操作map,如:m[“one“] = 1,delete(m, “one“)。
5.什么是接口(interface)?它有什么作用?如何定义和实现接口?
答:接口(interface)是一种抽象类型,它定义了一组方法。任何实现了接口中所有方法的类型都是这个接口类型的实现类型。接口的定义方式是使用type关键字和interface关键字,如:type MyInterface interface { method1() int method2() string }。实现接口的方式是实现接口中定义的所有方法。
6.Go中的defer语句是什么?它有什么作用?如何使用defer语句?
答:defer语句是用于在函数退出时执行一些操作的语句,比如关闭文件、释放资源等。defer语句可以在函数中任何地方使用,并且可以有多个defer语句,它们的执行顺序是后进先出的。