跳至主要內容

入门

LincZero大约 7 分钟

入门

知识

背景

  • 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
        • testProject02/

编写代码

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)相对轻量