入门
入门
知识
背景
- go语言的于2007年在谷歌创建,2012年发布开源版本1.0
- 团队:罗伯特 格瑞史莫、罗勃 派克、肯 汤普逊
- 发明人之一 肯 汤普逊,他还发明了B和C编程语言
吉祥物:金花鼠 Gordon
特点
- 特点
- 简单高效:它的设计初衷呢就是简单高效,这也是为什么我们常常说go而不是golang的原因
- 编译型语言,静态类型语言:源代码被编译成机器代码后,意味着它通常优于解释型语言,尽管构成一种静态类型语言
- 极快的编译时间:但它以极快的编译时间而闻名,这也得益于依赖性的分析方法,更为类型推断提供了非常简洁和实用的语法
- 模块系统:此外它还具有一个我们所知道的 package包和某种模块系统,便于在项目之间的进行导入和导出代码
- 垃圾回收:支持
- 语法特点
- 从语法上讲 go就像C或C++的简明版本。例如声明一个变量,其中的word关键字后,跟其名称和类型并用一个值进行初始化,或者你也可以用短赋值语法来替代word,并自动推断类型,你还可以在一行中定义多个变量构
- 具有编程语言中所期望的所有功能,如数组啊,map循环控制
- 它也允许你使用指针存储值的内存地址,但不允许使用智能算法,这会导致很多不可预测的行为
- 此外go还支持并发历程,go历程是利用CPU上的多个线程,与其他函数同时运行的函数
实用性
- 应用领域
- Go服务器端/游戏软件工程师
- Go分布式/云计算软件工程师
- 区块链工程师
- 落地
- Docker就是用Golang编写的,它在容器化方面表现出色
- 就业
- Google、Facebook、腾讯、百度、京东、小米、360、美团、滴滴、阿里、七牛等
快速入门
- 使用流程
- 安装:go的使用需要先进行安装
- 编写:然后在系统上打开一个空目录,创建一个点go结尾的文件,顶部添加package,main里创建一个独立的可执行文件,接着声明一个main函数,该函数就是程序开始执行的地方,都有一个标准的核心,包括用于处理常见的需求 像我们的数学呀 网络呀 格式化呀,通过导入format 我们可以将这一行内容打印为标准输出
- 编译:运行go build命令,它可以将源代码和依赖下 快速编译成可执行的二进制文件
- 依赖解决:说到依赖项 我们还可以连接到GITHUB上的远程包,例如运行go mode in it 这将创建一个go模块文件,已启用依赖性跟踪。
软件环境
安装 - IDE
- Visual Stuido Code
- Sublime Tet
- Vim
- Emacs
- Eclipse
- LiteIDE
- JetBrains
这里选 VSC
取消目录折叠 设置:右下设置 > User > Features > Explorer > Compact Folders 取选
安装 - 开发环境 SDK
安装
和Java类型,这里也需要一个 SDK (Software Development Kit 软件开发工具包)
下载:去 golang.org 官网下载,国内可以选用中文社区:https://studygolang.com/dl,windows能下zip或msi
环境结构
安装后的文件夹如下:
- bin/, go的一些常用命令
- go.exe, 运行和编译器,类似java.exe
- gofmt.exe, 进行代码格式化的
- lib/
- misc/
- pkg/
- include/
- tool/
- src/, 里面是一些.s或.go文件
- test/, 里面是一些.go文件
- codereview.cfg
- go.env
- PATENTS
- (docs), 文本类
- api/, api存放,里面全是.txt文档
- doc/,html文档
- CONTRIBUTING.md
- LINCENSE
- README.md
- SECURITY.md
- VSRSION
检查
$ go version # 在任意路径下
go version go1.22.1 windows/386
# 如果没有,就cd到 安装路径/bin/go.exe 所在路径。如果那个路径有,则表示没配置好环境变量
# 例如zip而非msi安装不会自动配置环境变量,就要自己去配置
前提知识 - windows dos命令
win+R,cmd回车
盘符: # 切换盘符
dir # 查看路径下文件,Linux中的 ls
cd 路径 # 切换路径,.表示当前路径,..表示上一层路径
cls # 清屏
上下箭头 # 切换历史命令
tab按键 # 命令补全
md # 创建目录,Linux中的 mkdir
rd # 删除目录,Linux中的 rm -r
copy # 复制文件,Linux中的 cp
del # 删除文件,Linux中的 rm
HelloWorld
项目新建、项目结构
准备好Go的项目结构:
- goProject/
- src/
- goCode/
- testProject01/
- main/, 项目所在的包
- test.go
- unit2/
- demo01/
- main.go
- demo01/
- main/, 项目所在的包
- testProject02/
- testProject01/
- goCode/
- src/
编写代码
main.go
package main // 声明文件所在的包,每个go文件必须有归属的包。包名最好和文件名一致,而且必须存在main包,否则报错:cannot run non-main package
import "fmt" // 引入程序中需要用到的包,然后可以使用包里的函数,比如下面的 fmt.Println
func main() { // 主函数,程序入口
fmt.Println("Hello World") // 控制台输出
}
注意项:
声明文件所在的包,每个go文件必须有归属的包。
这点有点类似Java的包管理,但似乎更严格。也有些类似于Java “所有函数都必须在类里” 的思想 (这点与C/C++不同)
编译与运行
单文件编译:
$ cd goProject/src/goCode/testProject01/main/
$ go build test.go # 然后在windows环境直接就能生成小体积的test.exe,这点还是很不错的 (某些语言要生成exe还要做其他工作的,比较典型的如python要pyinstaller等)
直接运行:
$ cd goProject/src/goCode/testProject01/main/
$ go run test.go # 底层还是先编译再运行
Hello World
扩展 - 编译选项
go build -o hello.exe test.go # 指定生成路径和名字
语言对比 - 编译篇 (摘自语言对比专题)
摘自笔记的 MdNote_Public/Develop/Language/Different/编程语言/编译详解 笔记
与其他语言不同:
项目工程层级
忽略掉 .vscode、.husky、.gitignore、.clang-format、LICENSE、README.md 这一类任意语言及完全可选的文件。
- Java
- 最普通的java单文件简单,java.exe生成字节码
- SE 有复杂固定的项目结构,多种不同格式的文件。可以通过IDE直接创建对应结构的Project
- EE 类似SE,但我不是很熟
- C++
- C/C++:简单一些,小型项目结构几乎只有头文件和源码。gcc / g++ 加一些编译参数即可实现单文件/多文件编译
- 大型一点增加了.sln / CMakeList.txt / makefile 这种编译及链接辅助文件
- Qt:也有多种不同格式的文件,但感觉没 Java 繁琐。可以通过IDE直接创建对应结构的Project
- JavaScript、Python
- 也简单,只有一个 package.json 或 requirement.txt 的依赖库文件
- Vue这种框架项目复杂一些。可以借助脚手架来创建项目
- Go
- 单文件编译很简单,go build test.go。大项目也有一些需要遵循的结构规则 (如每个文件都要有所属的包)
跨平台策略
当然,比较影响这方面的是语言的编译跨平台策略
- 一次编写,随处编译 (Write Once, Compile Everywhere, WOCE)
- C/C++、Rust
- 一次编写,随处运行 (Write Once, Run Anywhere, WORA)
- Java (字节码形式):需要目标机器安装Java虚拟机 (JVM),JVM将字节码转化为机器代码
- Python (脚本形式):需要目标机器安装Python解释器
- 其他跨平台策略
- HTML/JavaScript/CSS
- .NET Framework/.NET Core:需要目标机器安装.NET运行时环境
- Kotlin/Scala (字节码/js形式)
- GO:可以同时 WOCE 和 WORA 的
生成windows可执行文件
某些语言要生成exe还要做其他工作的。而且有些语言并不以总是在使用环境中被以可执行文件运行 (见跨平台策略)
WOCE型的语言,更容易实现exe的生成 (本来就是要使用可执行文件的)
WOCE
- c/c++:配置工具链,mingw/msvc等,选择好编译环境,然后编译即可
WORA
- python:python要额外使用pyinstaller等打包工具
- java:忘了,好像要 Launch4j 和 JSmooth 等打包工具
其他
C# .NET:windows似乎要对面另外安 .NET 5、.NET 6 环境这样,就不会另外再打包环境了
Go:
go build test.go
,在windows环境直接就能生成小体积的test.exe,在linux环境估计也是直接生成可执行文件。可以说非常方便了Go 似乎是可以同时 WOCE 和 WORA 的。因为Go 语言的运行时(runtime)相对轻量