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

go基本用法

1. mod

go mod init github.com/yourusername/myproject

2.导包

函数大写:对外开放public

匿名导包_

起别名

3.数据类型

​Go 中所有参数传递本质上都是值传递​​,map 和 slice、channel 等类型之所以表现出引用传递的特性,是因为它们内部包含指向底层数据的指针

struct:实现类,封装、继承

interface(父类指针):多态,interface{}万能类型,value, ok = arg.(string)

4.Go调度器核心设计策略详解

1. 线程复用机制(Thread Reuse)

Go调度器通过三级结构实现线程复用:

  • ​M(Machine)​​:操作系统线程实体
  • ​P(Processor)​​:逻辑处理器,含本地运行队列
  • ​G(Goroutine)​​:轻量级协程

工作流程:

  1. 空闲M会尝试绑定一个P(默认P数量=GOMAXPROCS)
  2. P从其本地队列(LRQ)取出G交给M执行
  3. 当G阻塞时,M会解绑P并进入休眠,P转而寻找其他可用M
  4. G执行结束后返回队列,M继续获取新任务

复用优势:

  • 避免频繁创建/销毁OS线程(系统调用开销大)
  • 通过P的中间层解耦M与G的关系
  • 本地队列减少全局锁竞争

2. 并行执行策略(Parallelism)

Go通过三层并行设计充分利用多核:

  • ​GOMAXPROCS控制P数量​​:通常设为CPU核心数
  • ​每个P独立调度​​:拥有本地运行队列,无锁访问
  • ​工作窃取(Work Stealing)​​:空闲P会从其他P或全局队列偷G

并行特性:

  • 真正的物理并行(非并发)
  • P之间无通信开销
  • 自动负载均衡

3. 协作式抢占(Cooperative Preemption)

抢占触发点:

  1. ​显式让出点​​:

    • 通道操作(发送/接收)
    • 系统调用
    • 函数调用(编译器插入检查指令)
  2. ​时间片耗尽​​(Go 1.14+):

    • 异步抢占信号(基于信号机制)
    • 默认时间片10ms

G1运行中 -> 到达抢占点 -> 保存上下文 -> 放回队列 -> 调度器选择G2 -> 恢复G2上下文

演进历史:

  • Go 1.2:只在函数调用时检查抢占
  • Go 1.14:引入基于信号的全面抢占

4. 全局Goroutine管理

两级队列设计:

+------------------+       +------------------+
|  全局运行队列    |<----->|    P的本地队列    |
| (GRQ)           |       | (LRQ)           |
| [G1][G2][G3]... |       | [G4][G5]...     |
+------------------+       +------------------+

负载均衡策略:

  1. ​新建Goroutine​​:

    • 优先放入当前P的LRQ
    • LRQ满时放入GRQ
  2. ​调度选择顺序​

  • 本地队列(LRQ)
  • 全局队列(GRQ)
  • 网络轮询器(network poller)
  • 从其他P窃取

设计哲学:

  1. ​层次化​​:M-P-G三级结构各司其职
  2. ​本地化​​:优先使用本地资源减少竞争
  3. ​弹性​​:动态调整资源分配
  4. ​高效​​:最小化调度开销(纳秒级切换)
http://www.dtcms.com/a/267550.html

相关文章:

  • CentOS虚拟机ifconfig命令不显示IP地址解决方法
  • 【无标题】JavaScript入门
  • LESS/SCSS 高效主题换肤方案
  • P1424 小鱼的航程(改进版)
  • WPF学习笔记(24)命令与ICommand
  • LeetCode 第91题:解码方法
  • 二叉树题解——二叉搜索树中第 K 小的元素【LeetCode】使用外部变量ans记录答案
  • C++ 网络编程(15) 利用asio协程搭建异步服务器
  • 【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的关系是什么?
  • [学习] 深入理解 POSIX
  • 面试150 最长连续序列
  • Node.js worker_threads深入讲解教程
  • 【LeetCode102.二叉树的层序遍历】vs.【LeetCode103.二叉树的锯齿形层序遍历】
  • Apollo自动驾驶系统中Planning模块的架构设计与核心逻辑解析(流程伪代码示例)
  • 45-使用scale实现图形缩放
  • 探索 .NET 桌面开发:WinForms、WPF、.NET MAUI 和 Avalonia 的全面对比(截至2025年7月)
  • 炼丹炉 TD-trainer 的安装与部署,LoRA、dreambooth
  • <三>Sping-AI alibaba 文生图
  • Cursor/VScode ,点击运行按钮,就打开新的终端,如何设置为在当前终端运行文件而不是重新打开终端----一招搞定篇
  • 数字孪生技术引领UI前端设计新潮流:虚拟现实的深度集成
  • 在sf=0.1时测试fireducks、duckdb、polars的tpch
  • OpenLayers 设置线段样式
  • 深入学习c++之---AVL树
  • 支持零样本和少样本的文本到语音48k star的配音工具:GPT-SoVITS-WebUI
  • 完成ssl不安全警告
  • DQL-6-分页查询
  • Redis的编译安装
  • PVE DDNS IPV6
  • 超详细yolo8/11-detect目标检测全流程概述:配置环境、数据标注、训练、验证/预测、onnx部署(c++/python)详解
  • Altium Designer使用教程 第一章(Altium Designer工程与窗口)