当前位置: 首页 > news >正文

Go 语言面试题


  1. 并发
    一句话:go 关键字启动 goroutine,channel 做 CSP 通信。
go f()          // 启动
ch <- v         // 发送
v := <-ch       // 接收
  1. error 处理
    一句话:最后一个返回值约定为 errorif err != nil 立刻处理;堆栈用 fmt.Errorf("%w", err)github.com/pkg/errors
if err != nil {return fmt.Errorf("wrap: %w", err)
}
  1. 接口
    一句话:隐式实现,只要方法集匹配就算实现。
type Foo interface{ Bar() }
type T struct{}
func (T) Bar() {}   // T 实现了 Foo
  1. init
    一句话:包级 func init(),在 main 之前按 import 深度顺序执行;常用来做一次性初始化。
func init() { rand.Seed(time.Now().Unix()) }
  1. 声明变量
    一句话:三种——var x intx := 1var (a=1 b=2)

  2. 基础类型
    一句话:数字、字符串、bool、派生类型(array、slice、map、struct、pointer、func、chan、interface)。

  3. 两个 nil 是否相等
    一句话:类型相同时可比较;interface 与具体类型 nil 不相等是常见坑。

var p *int = nil
var i interface{} = p
fmt.Println(i == nil) // false
  1. 常量
const Pi = 3.14
  1. 方法
    一句话:在 func 名前加接收者 (t T)(t *T)
func (p Person) Name() string { return p.name }
  1. loop
for i:=0; i<10; i++ {}   // 三段式
for {}                   // while(true)
  1. 数组
    固定长度:var a [5]int;自动长度:a := [...]int{1,2,3}

  2. 切片
    动态数组,三字段结构:ptr,len,cap

s := []int{1,2,3}
s = append(s, 4)   // 记得接收返回值
  1. map
m := make(map[string]int)
m["age"] = 30
  1. map 遍历/取值/删除
for k, v := range m { ... }
v := m["key"]
delete(m, "key")
  1. 遍历时删除
    一句话:官方未定义行为,先收集 key 再删或复制新 map。

  2. 不能当 key 的类型
    slice、map、func、含这些字段的 struct。

  3. 指针

p := &x
fmt.Println(*p)

传指针可修改原值;传值是拷贝。

  1. channel
ch := make(chan int)      // 无缓冲
buf := make(chan int, 3)  // 有缓冲
  1. 无缓冲 vs 有缓冲
    无缓冲:收发同步阻塞;有缓冲:缓冲未满则异步,满后阻塞。

  2. 读 channel
    v := <-ch

  3. 关闭 channel

close(ch)
v, ok := <-ch   // ok==false 表示已关闭
  1. goroutine 与停止
    启动:go f();停止:通过 context.WithCancelchan struct{} 通知退出。

  2. 公开/私有
    首字母大写导出,小写包内私有。

  3. 包循环依赖
    一句话:Go 禁止;把公共接口提到第三个包或合并包。

  4. 包 vs 模块
    包 = 目录下 .go 文件;模块 = 带 go.mod 的若干包集合,带版本号。

  5. 编译可执行

go build -o app main.go
  1. nil slice vs 空 slice
    nil:var s []int(lencap0,未分配底层数组);空:s := []int{}(len==0,cap>=0,已分配)。

  2. append

s = append(s, 1, 2, 3)
  1. nil map vs 空 map
    nil:var m map[K]V(未初始化,直接赋值 panic);空:m = make(map[K]V)(可用)。

面试小贴士
• 问“slice 和数组区别”,先答“长度固定 vs 动态”,再补“底层结构 len/cap”。
• 问“goroutine 泄露”,答“忘记接收导致 channel 阻塞”或“没有 cancel context”。
• 问“map 是否并发安全”,答“不安全,需加锁或用 sync.Map”。

http://www.lryc.cn/news/602309.html

相关文章:

  • 数据分析干货| 衡石科技可视化创作之仪表盘控件如何设置
  • GitLab 公共仓库:coding 用到的 git 命令
  • Springboot社区养老保险系统小程序
  • 一文理清 Linux 软件管理核心知识:从程序组成到包管理工具
  • Java面试宝典:MySQL8新特性
  • shell学习从入门到精通(第二部分)
  • 机器学习sklearn:决策树的参数、属性、接口
  • nccl中__syncthreads的作用及例子 (来自deepseek)
  • 135端口与WMI攻防全解析
  • 网络安全基础知识【4】
  • python中类变量 __slots__ 解析
  • 5190 - 提高:DFS序和欧拉序:树上操作(区域修改1)
  • 排序算法 (Sorting Algorithms)-JS示例
  • AI原生应用:从人机关系重构到数字空间革命
  • RF随机森林分类预测+特征贡献SHAP分析,通过特征贡献分析增强模型透明度,Matlab代码实现,引入SHAP方法打破黑箱限制,提供全局及局部双重解释视角
  • 力扣7:整数反转
  • OCR 赋能合同抽取:不良资产管理公司的效率加速器
  • Kafka 顺序消费实现与优化策略
  • 数据结构之顺序表链表栈
  • 【Git】Linux-ubuntu 22.04 初步认识 -> 安装 -> 基础操作
  • 图片PDF识别工具:扫描PDF文件批量OCR区域图识别改名,识别大量PDF区域内容一次性改名
  • 基于LSTM和GRU的上海空气质量预测研究
  • 图片上传 el+node后端+数据库
  • 如何用VUE实现用户发呆检测?
  • Android通知(Notification)全面解析:从基础到高级应用
  • 【前端】解决Vue3+Pinia中Tab切换与滚动加载数据状态异常问题
  • 05 OpenCV--图像预处理之图像轮廓、直方图均衡化、模板匹配、霍夫变化、图像亮度变化、形态学变化
  • 数据结构:下三角矩阵(Lower Triangular Matrix)
  • MySQL SQL性能优化与慢查询分析实战指南:新手DBA成长之路
  • Eigen 中矩阵的拼接(Concatenation)与 分块(Block Access)操作使用详解和示例演示