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

【go】程序启动时发生了什么?为什么选择go语言开发,优势劣势

go程序运行主要发生了什么?

可以分三个阶段回答:操作系统的处理阶段,runtime运行时处理阶段,用户代码执行阶段

  • 操作系统处理阶段:
    • 加载可执行文件到内存
    • 设置堆栈
    • 加载环境变量
    • 创建线程
  • runtime运行时处理阶段:
    • 初始协程栈,大小2kb,动态扩容
    • 划分内存区域(arena、bitmap、spans)
    • 启动GC
    • GMP调度器初始化
  • 用户代码
    • 针对导入的包,进一步深入到调用的最底层
      执行该包的init(),然后跳回上一层,执行init,
      直到回到主函数的init执行后,执行main
    • 如果main里有新的协程创建,那么交由GMP调度器管理
    • 程序退出时,执行所有defer函数,然后退出

为什么学go?优势,劣势?

  • 为什么学?语法简单清晰,执行高效
  • go优势
    • 通过goroutine协程和channl管道,支持原生高并发
    • 接近C语言的性能,但是语法更简单
    • 开发效率高,相对于java历史遗留问题没那么多,毕竟是新时代后端开发语言
    • Docker,k8s,普罗米修斯都是go写的,云原生生态好
  • go劣势
    • 错误处理比较冗长,有很多重复代码
    • 相较于java比较年轻,生态库没有java丰富
    • GC垃圾回收在极高性能要求场景有延迟问题

https://github.com/0voice

http://www.xdnf.cn/news/8692.html

相关文章:

  • 5.1/Q1,GBD数据库最新文章解读
  • 创新项目实训开发日志7
  • 【动态规划】简单多状态(一)
  • 77. Combinations
  • Qt实战:自定义QTreeWidget搜索隐藏显示项功能 | 附完整源码
  • 基于音频Transformer与动作单元的多模态情绪识别算法设计与实现(在RAVDESS数据集上的应用)
  • 算法、算力、数据哪个更重要
  • C#核心概念解析:析构函数、readonly与this关键字
  • java 代码查重(五)比较余弦算法、Jaccard相似度、欧式距离、编辑距离等在计算相似度的差异
  • 开发者工具箱-鸿蒙大小写转换开发笔记
  • H3C-WAF-单机部署
  • 【每天一个知识点】“数字人”(Digital Human)
  • Easy Dataset数据集构建使用
  • 解析 Flask 上下文机制:请求上下文、应用上下文
  • AI Agent开发第74课-解构AI伪需求的魔幻现实主义
  • 【c++】成员函数被声明为 `const` 时
  • Oracle 的SHRINK 操作实现原理
  • 软考学习中
  • Docker Swarm配置
  • Linux系统基础——是什么、适用在哪里、如何选
  • 模拟电子技术基础----绪论
  • Python 训练营打卡 Day 34
  • 前端流行框架Vue3教程:24.动态组件
  • vue3使用七牛云上传文件
  • MATLAB例程——基于分批运输与最近邻优化的垃圾运输路径规划,n个垃圾收集点,每点有固定垃圾量,车辆从处理厂出发收集垃圾后返回,目标是最小化总行驶距离
  • 洛谷B2144 阿克曼(Ackermann)函数
  • 互联网和以太网之是什么与区别
  • 2025年安克创新Anker社招校招入职测评 | 3天备考、自适应能力cata测评北森题库、安克创造者启航试炼、安克AI能力测评能力测评历年真题
  • Python协同过滤算法:从原理到实战应用
  • 数据库6——综合实验-水果商店进阶一