go
一、Go 基础语法
Go 的主要特点有哪些?
- 静态类型、编译型、并发原生支持(goroutine + channel)、内存安全、垃圾回收、跨平台、语法简洁。
Go 有哪些内置基本数据类型?
- 整型:
int8, int16, int32, int64, int - 无符号整型:
uint8(byte), uint16, uint32, uint64, uint - 浮点型:
float32, float64 - 复数:
complex64, complex128 - 字符:
rune - 布尔:
bool - 字符串:
string
- 整型:
Go 变量声明方式?
1
2
3var a int = 10
var b = 20
c := 30 // 短变量声明Go 常量和 iota 的作用?
const定义常量。iota是常量计数器,用于枚举。
1
2
3
4
5const (
A = iota // 0
B // 1
C // 2
)字符串在 Go 中是可变的吗?
- 不可变。修改字符串必须转成
[]byte或[]rune。
- 不可变。修改字符串必须转成
二、Go 容器类型
- 切片 (slice) 和数组 (array) 区别?
- 数组:长度固定,值类型。
- 切片:基于数组实现,长度可变,引用类型。
- map 的特点?
- 哈希表实现,
map[key]value。 - key 必须可比较(不能是 slice、map、function)。
- 访问不存在的 key 返回零值。
- 哈希表实现,
- range 的返回值?
- 遍历 slice/array:返回 index 和 value。
- 遍历 map:返回 key 和 value。
- 遍历 string:返回索引和 rune。
三、函数与方法
- Go 支持函数重载吗?
- 不支持。
- defer 的执行顺序?
- 后进先出 (LIFO)。
- 值传递 vs 引用传递?
- Go 所有参数都是值传递。
- 传引用类型(slice、map、channel、指针)时,值里存的是底层数据地址。
四、结构体与接口
- 结构体和类的区别?
- Go 没有类,只有结构体(struct)。
- 没有继承,支持组合。
- Go 的接口特点?
- 隐式实现,无需显式
implements。 - 接口是方法集合,零值是
nil。
- 空接口
interface{}的作用?
- 可存放任意类型,相当于 Java 的
Object。
五、并发与协程
- goroutine 是什么?
- Go 的轻量级线程,由 Go runtime 调度。比 OS 线程更轻。
- channel 的作用?
- 在 goroutine 之间安全传递数据。
- 支持无缓冲、有缓冲。
- select 的作用?
- 多路复用,用于监听多个 channel。
六、内存与 GC
- Go 的垃圾回收机制?
- 三色标记 + 混合写屏障。
- make 和 new 的区别?
new(T)分配内存,返回指针,零值初始化。make用于 slice、map、chan 初始化,返回对象。
- 逃逸分析 (escape analysis) 是什么?
- 编译器决定变量分配在栈还是堆。
七、常见陷阱题
- for range 遍历 slice 时修改值会怎样?
- 修改循环变量不会影响原切片,要用索引操作。
- nil slice 和空 slice 区别?
nil slice:var s []int,len=0, cap=0。空 slice:s := []int{},len=0, cap=0,但非 nil。
- map 并发读写会怎样?
- 直接 panic,需要
sync.Map或加锁。
- defer 在 return 前还是后执行?
- 在 return 之后,但返回值赋值之前。
八、标准库与实践
- 常见 Go 标准库?
fmt:格式化 I/Onet/http:HTTP 服务sync:并发同步time:时间操作os、io、bufio:文件操作
- Go 如何处理错误?
- 使用
error接口,返回值明确错误。 - 不支持异常捕获,只有
panic/recover。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 浮生若梦!
