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

【Go - 编译:浅尝辄止 】

1,为什么编译

编译 VS 不编译

在Go语言中,你可以选择go build编译代码生成二进制文件,或者直接使用go run命令运行代码。两种方式各有优缺点,

编译(go build

优点

  1. 性能:编译生成的二进制文件是机器码,运行时性能更高,因为不需要解释或编译代码。
  2. 独立性:生成的二进制文件是独立的,不依赖于Go编译器或其他外部库,可以在目标平台上直接运行。
  3. 分发:编译后的二进制文件可以方便地分发和部署到不同的环境中,而不需要在目标环境中安装Go编译器。
  4. 启动速度:编译后的二进制文件启动速度更快,因为不需要在运行时进行编译。

缺点

  1. 编译时间:编译过程需要时间,特别是对于大型项目,编译时间可能较长。
  2. 调试:在开发过程中,频繁编译可能会影响开发效率。调试时需要重新编译代码。

直接运行(go run

优点

  1. 快速迭代:不需要编译步骤,代码修改后可以立即运行,适合快速开发和调试。
  2. 简单:适合小型项目或脚本,减少了编译和生成二进制文件的步骤。

缺点

  1. 性能go run在运行时会先编译代码,然后再执行,性能不如直接编译生成的二进制文件。
  2. 依赖:需要在运行环境中安装Go编译器,不能像编译后的二进制文件那样独立运行。
  3. 启动速度:由于需要先编译再运行,启动速度较慢,特别是对于大型项目。

示例

假设你有一个简单的Go程序main.go

package mainimport "fmt"func main() {fmt.Println("Hello, World!")
}

使用go build编译

go build -o myapp main.go
./myapp

使用go run直接运行

go run main.go

小结

  • *编译(go build)**适合生产环境、分发和部署,提供更高的性能和独立性。
  • *直接运行(go run)**适合开发和调试阶段,提供更快的迭代速度和简便性。

根据具体的使用场景和需求选择合适的方式,可以更好地利用Go语言的特性。

2,编译过程

在Go语言中,编译过程将源代码转换为可执行的二进制文件。以下是Go的编译过程,以及编译后的产出。

编译过程

  1. 解析和语法检查
    • 编译器首先解析Go源代码文件,进行语法检查,确保代码符合Go语言的语法规则。
    • 如果有语法错误,编译器会报告错误并停止编译。
  2. 类型检查
    • 编译器进行类型检查,确保所有变量和表达式的类型正确。
    • 如果有类型错误,编译器会报告错误并停止编译。
  3. 依赖解析
    • 编译器解析代码中的依赖项,确定需要导入的包和库。
    • 编译器会检查这些依赖项是否存在,并确保它们没有循环依赖。
  4. 中间代码生成
    • 编译器将源代码转换为中间代码(Intermediate Representation, IR),这是一种抽象的低级表示形式。
    • 中间代码便于进行优化和代码生成。
  5. 优化
    • 编译器对中间代码进行各种优化,以提高生成代码的性能和减少代码大小。
    • 常见的优化包括常量折叠、循环优化、死代码消除等。
  6. 代码生成
    • 编译器将优化后的中间代码转换为目标平台的机器码。
    • 机器码是特定于目标平台的低级指令,可以直接在目标平台的处理器上执行。
  7. 链接
    • 编译器将生成的机器码与所需的库和依赖项链接在一起,生成最终的可执行文件。
    • 链接过程包括静态链接和动态链接。Go语言默认使用静态链接,将所有依赖项打包到一个独立的二进制文件中。

编译后的产出

编译后的产出是一个可执行的二进制文件。这个文件包含了所有必要的代码和依赖项,可以在目标平台上独立运行。

交叉编译示例

假设你在macOS上开发,但需要生成适用于Linux的二进制文件,可以使用以下命令:

GOOS=linux GOARCH=amd64 go build -o myapp-linux main.go

生成的myapp-linux二进制文件可以在Linux系统上独立运行。

3,问题

Q:编译的binary是否是二进制文件独立运行,不依赖其它,比如 python程序可以打包为binary,但是会将其解释器打包进去。

A:Go编译生成的二进制文件是独立运行的,不依赖于其他外部库或解释器。Go语言的编译器会将所有依赖项静态链接到生成的二进制文件中,从而使其可以独立运行。这与Python等解释型语言不同,Python程序通常需要将解释器打包进去。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 华为云全域Serverless技术创新:全球首创通用Serverless平台被ACM SIGCOMM录用
  • Android进阶之路 - 解决WebView加载H5时软键盘遮挡输入框问题
  • python的多线程
  • 自动化部署的艺术:Conda包依赖管理的终极指南
  • 从传统监控到智能化升级:EasyCVR视频汇聚平台的一站式解决方案
  • 春秋云境 | 文件上传 | CVE-2022-28525
  • linux文本处理命令:文本搜索工具grep详解
  • C++ | Leetcode C++题解之第322题零钱兑换
  • 【Docker学习记录】
  • 基于ESP32的掌上网关智能家居控制设备:集成MQTT、后端Node.js、MongoDB、React(代码示例)
  • IntelliJ IDEA 打包教程
  • marker - PDF 转 markdown
  • 基于STM32的智能家居灯光控制系统
  • 伯克利Linux系统管理: 脚本编写学习 课堂与实验(系统简洁保姆级学习)
  • Python爬虫技术 第32节 最佳实践和常见问题
  • 10个确保微服务与容器安全的最佳实践
  • angular2 简述
  • Computed property XXX was assigned to but it has no setter
  • Linux Process Manage
  • Tornado学习笔记(1)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue 个人积累(使用工具,组件)
  • Vultr 教程目录
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 离散点最小(凸)包围边界查找
  • 使用 QuickBI 搭建酷炫可视化分析
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 译米田引理
  • 因为阿里,他们成了“杭漂”
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 终端用户监控:真实用户监控还是模拟监控?
  • 如何用纯 CSS 创作一个货车 loader
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #大学#套接字
  • #数据结构 笔记三
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (Matlab)使用竞争神经网络实现数据聚类
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (回溯) LeetCode 131. 分割回文串
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • .net core + vue 搭建前后端分离的框架
  • .NET中GET与SET的用法
  • [Android]How to use FFmpeg to decode Android f...
  • [BT]BUUCTF刷题第4天(3.22)
  • [C++][数据结构][跳表]详细讲解
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算
  • [IDF]摩斯密码
  • [JS入门到进阶] 前端开发不能写undefined?这是误区!
  • [Meachines] [Easy] Mirai Raspberry树莓派默认用户登录+USB挂载文件读取
  • [M二叉树] lc236. 二叉树的最近公共祖先(dfs+二叉搜索树)
  • [NOIP2000] 乘积最大
  • [office] excel2003进行可视性加密的方法 #媒体#其他#知识分享
  • [Paper]Application of deep convolutional neural network for automated detection of myocardial...