外观
Go语言基础与数据类型
约 952 字大约 3 分钟
Go数据类型面试题
2025-06-08
1. 什么是Go语言?Go语言有哪些特点?
Go语言是Google开发的一种静态强类型、编译型语言。主要特点包括:
- 语法简洁,只有25个关键字,易于学习
- 支持跨平台编译,编译生成二进制可执行文件能直接运行在对应系统上
- gc高效,延迟低,减少了内存占用和卡顿
- 天然支持高并发,使用goroutine,启动成本很低(只需2KB内存),可以轻松创建百万级并发任务,且能够通过GMP自动调度利用多核CPU资源;通过channel协程通信实现共享内存,简化并发编程
2. Go是面向对象的语言吗?
是也不是。
Go不是传统意义上的面向对象语言: Go 语言没有类(class)和继承(inheritance)的概念,也没有类型层次结构。它不支持像 Java 或 C++ 那样完整的面向对象特性,例如方法重写
Go支持面向对象编程风格和核心概念: Go 语言通过其独特的方式实现了面向对象编程的一些核心概念:
- 封装(Encapsulation):通过结构体(struct)和大小写来控制字段和方法的可见性,实现数据的封装。
- 组合(Composition):Go 语言提倡“组合优于继承”的设计原则,通过在结构体中嵌入其他结构体来复用代码和实现类似继承的功能。
- 多态(Polymorphism):主要通过接口(interface)实现。Go 的接口是隐式实现的,任何类型只要实现了接口中定义的所有方法,就被认为实现了该接口,这提供了一种灵活且通用的多态机制。
3. Go中make和new的区别?
- make只能用来分配及初始化slice、map、chan三种类型的数据,new可以分配任意类型的数据
- 调用make方法得到的结构体本身(值类型),调用new方法得到的是结构体的指针(引用类型)
- make在为结构体分配内存空间后会进行初始化,比如调用make创建slice后会初始化slice的Cap/Len等属性,slice中的指针也会指向对应的底层数组;调用new得到的指针指向的内存空间会被清零,需要手动初始化。
4. 数组和切片的区别,切片怎么扩容
区别
- 数组是值类型,切片是引用类型
- 数组长度固定,切片长度不固定
- 不同长度的数组在go语言中表示不同的类型,不同长度的切片在go语言中类型相同
切片扩容
go1.18之后的扩容逻辑:
相关知识推荐
5.for i, v := range 切片,v的地址会变化吗?
- 在go1.22版本之前,这个地址不会变化,每遍历到一个元素,就会把该元素的值写到v的地址中
- 从go1.22版本开始,v的地址会变化,for range遍历过程中不再共享变量v
6. go defer,多个defer的顺序,defer在什么时候会修改返回值?(defer和return)
执行顺序
- defer的执行顺序类似栈,遵循后进先出的顺序,先调用的defer语句后执行
defer在return的时候有机会修改返回值
return的过程可以被分解为以下三步:
- 设置返回值
- 执行defer语句
- 将结果返回
defer recover的问题
- 用recover捕获异常时,只能捕获当前goroutine的panic,不能捕获其他goroutine的panic
- 一个recover只能捕获一次panic,且一一对应