
文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载本篇技术指南以 90DaysOfDevOps 2022 路线图第 9 天的内容为主体围绕仓库中 Hello World 源码 逐行讲解 Go 语言的核心机制什么是编译、什么是包package、main包与main函数的特殊规则以及fmt.Println的标准输出原理。读者读完可以完整理解一个最小可运行 Go 程序的每一行代码并具备在此基础上阅读和编写多文件、多包 Go 项目的能力。Go 源码经过编译器Compiler翻译为机器可执行的二进制文件这正是编译Compiling过程的直观示意。从第 8 天说起我们已经有了一个可运行的程序在 第 8 天 中我们完成了 Go 在本地工作站的安装与开发环境配置使用go version验证安装、创建src/Hello目录、在 VS Code 中编写main.go并通过go run main.go直接运行、用go build main.go编译出可执行文件。第 9 天不再停留在能跑就行而是回到这份代码本身逐行弄清楚它为什么这样写、每一行在做什么。这是从照抄示例走向真正理解语言的关键一步。什么是编译Compiling在逐行阅读 Hello World 的 6 行代码 之前需要先建立对编译的基本认识。我们常用的 Python、Java、Go、C 都属于高级语言high-level languages它们以接近人类阅读习惯的语法书写便于程序员阅读与维护。但计算机的 CPU 只能执行机器码machine code无法直接理解fmt.Println这样的语句。因此我们必须把人类可读的源代码翻译成机器可读的机器码这个过程就称为编译compiling。在 第 8 天 中我们实际执行过的就是这一步go build main.go这条命令让 Go 编译器读取main.go源码将其翻译并链接成一个独立可执行的文件。编译完成后即使目标机器上没有安装 Go 环境也可以直接运行该二进制文件——这也是 Go 常被用于交付运维工具如 CLI 工具、Agent 程序的原因之一产物是单一静态可执行文件部署成本极低。仓库中的 makefile 进一步展示了 Go 交叉编译的威力它通过GOOS/GOARCH环境变量一次性产出多平台二进制build: GOARCHamd64 GOOSdarwin go build -o ${BINARY_NAME}_0.2_darwin main.go GOARCHamd64 GOOSlinux go build -o ${BINARY_NAME}_0.2_linux main.go GOARCHamd64 GOOSwindows go build -o ${BINARY_NAME}_0.2_windows main.go GOARCHarm64 GOOSlinux go build -o ${BINARY_NAME}_0.2_linux_arm64 main.go GOARCHarm64 GOOSdarwin go build -o ${BINARY_NAME}_0.2_darwin_arm64 main.go也就是说同一份main.go源码可以在 macOS、Linux、Windows 以及不同 CPU 架构amd64/arm64上编译出对应平台的可执行文件这正是编译相对解释执行的重要差异先编译后执行且产物与平台绑定。什么是包PackageGo 语言中包package是同一目录下被一起编译的源码文件的集合。通俗地讲一个包就是同一个目录里的一堆.go文件。回顾第 8 天创建的Hello目录——当 Go 程序变得复杂后你会看到folder1、folder2、folder3等不同目录分别存放不同的.go文件它们共同组成程序并各自构成不同的包。使用包的核心价值在于复用我们不必从零编写所有功能可以直接使用别人写好的、经过验证的包例如想给程序加一个计算器功能很可能会找到一个现成的、包含数学函数的 Go 包导入后即可使用长期来看能节省大量时间与精力。Go 语言鼓励开发者把代码组织进不同的包以方便复用和维护源码。仓库中 Go 目录 下的day11_example1.go、day12_example1.go、day13_example1.go等文件就是后续几天围绕包、函数、流程控制等主题不断扩充的示例集合——它们正是随着程序变复杂文件与包不断增多的现实写照。逐行拆解 Hello #90DaysOfDevOps下面是仓库中真实的 hello.go 源码第 8 天创建的main.go与之结构完全一致package main import fmt func main() { fmt.Println(Until tomorrow #90DaysOfDevOps) }提示原文档中的示例打印的是Hello #90DaysOfDevOps而仓库当前版本的 hello.go 打印的是Until tomorrow #90DaysOfDevOps。括号内的消息可以随意修改这正是Println的可定制之处。第 1 行package main—— 声明包名VS Code 中src Hello main.go的编辑器截图可以看到完整程序结构。第一行的package main声明这个文件隶属于名为main的包。规则要点所有.go文件都必须属于某个包文件的起始行应当是package something的形式包名可以任意命名但程序入口所在的包必须命名为main这是 Go 语言的一条硬性规则这是因为main包中包含程序的入口即main函数编译器需要靠它确定程序从哪里开始。第 3 行import fmt—— 引入标准库包import语句的作用是把另一个包引入到当前程序中之后就能使用该包导出的函数、类型等标识符。这里的fmt是 Go 官方提供的标准库包standard library package它包含了格式化输入输出相关的函数其中就包括我们第 6 行要用的fmt.Println()。因为我们在第 3 行导入了fmt所以第 6 行才能调用它。Go 提供大量标准库包如数学math、字符串strings、时间time、网络net/http等可以按需导入并在代码中复用省去从零实现底层功能的麻烦。第 5 行func main()—— 程序入口函数每当要编译并执行代码时机器必须知道从哪里开始执行。Go 通过寻找名为main的函数来确定程序入口。两个概念需要分清函数function一段可执行特定任务、并可在整个程序中复用的代码块main函数特殊命名的函数Go 运行时以它为程序的启动点。定义函数使用func关键字理论上函数可以任意命名但程序入口的函数必须叫main。花括号{ }内是函数体即程序入口处要执行的语句。第 6 行fmt.Println(...)—— 向终端输出PrintlnPrint Line是fmt包提供的一个函数作用是把标准输出standard output通常是终端写出一行文本——在可执行文件被成功执行的地方屏幕上就会打印出括号里的内容。它由三部分组成fmt.限定命名空间告诉编译器去fmt包里找这个函数Println函数名代表打印一行(...)参数即要打印的具体内容可以随意修改成任何字符串。修改括号内的文字后重新执行go run main.go或先go build main.go再运行生成的二进制就能看到新的输出——这是最简单的验证程序真的会按我们写的代码执行的方式。从源码印证这段程序在仓库里真实可运行以上拆解不是纸面讲解仓库中保留了完整的可运行证据hello.go第 9 天讲解的 6 行程序本体package mainimport fmtfunc main()fmt.Println四要素齐全makefile以main.go为编译对象演示同一程序如何交叉编译到 darwin/linux/windows 的 amd64/arm64 平台对应go build的进阶用法day08.md记录go version、go run main.go、go build main.go的完整环境搭建与首次运行步骤Go 目录下的 day11/day12/day13 示例后续几天在 Hello World 基础上继续扩展变量、函数、流程控制等内容可对照学习包与文件的演进方式。从源码结构可以推断day11_example*.go至day13_example*.go等文件均沿用package main的写法作为示例独立运行这正是第 9 天所讲包 入口函数规则在更大程序中的延续。TLDR六行代码速查表第 1 行package main 该文件属于名为main的包因为包含程序入口所以必须命名为main第 3 行import fmt 为了使用fmt.Println()必须先导入fmt标准库包第 5 行func main() 实际的程序起始点即main函数第 6 行fmt.Println(...) 在系统终端上打印引号中的文本如Hello #90DaysOfDevOps。下一步对 Hello World 有了逐行的理解后就可以继续阅读 第 10 天 以及仓库 Go 目录 中的day11_example1.go等示例进一步学习变量、函数与更复杂的包结构。结合 makefile 亲自执行一次go build你会对编译产出可执行文件有最直观的体感。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps 第 9 天逐行拆解 Go 的 Hello World——编译、包与 main 函数入门90DaysOfDevOps 第 9 天逐行拆解 Go 的 Hello World——编译、包与 main 函数入门 本篇指南聚焦 90DaysOfDevOp文档/教程90DaysOfDevOps 第九天逐行拆解 Go 的 Hello World——编译、包与 main 函数入门90DaysOfDevOps 第九天逐行拆解 Go 的 Hello World——编译、包与 main 函数入门 本文是 90DaysOfDevOps 系列学文档/教程90DaysOfDevOps 系列之 Go 语言入门逐行拆解 Hello World 代码编译、包与 main 函数90DaysOfDevOps 系列之 Go 语言入门逐行拆解 Hello World 代码编译、包与 main 函数 本篇是 90DaysOfDevOps文档/教程上一篇终极跨平台桌面待办清单如何用My-TODOs告别任务焦虑下一篇终极英雄联盟智能辅助工具LeagueAkari 完全配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考