Go的语言特点
Go 语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率使用一个表达式来形容 Go 语言:Go=C+Python,说明 Go 语言既有类似C语言这类静态语言的运行速度,又能达到 Python 动态语言的快速开发
继承C语言的理念
Go语言从C语言中继承了很多理念,包括表达式语法,控制结构,基础数据类型,调用参数传值,指针等等,也保留了和C语言一样的编译执行方式及弱化的指针
引入了包的概念
引入包的概念,用于组织程序结构,Go语言的一个文件都要归属于一个包,而不能单独存在。
类似Java的自动GC
Go语言提供了垃圾回收机制,内存自动回收,不需开发人员管理
天然支持并发
- 从语言层面支持并发,实现简单
goroutine
:轻量级线程,可实现大并发处理,高效利用多核。- 基于 CPS 并发模型(Communicating Sequential Processes )实现
- 吸收了管道通信机制,形成 Go 语言特有的管道
channel
通过管道channel
,可以实现不同的goroute
之间的相互通信。
类似Python的语法
- 函数可以返回多个值
编译部署效率快
- 编译速度快:Go 的编译器非常高效,即使是大型项目也能快速编译。
- 生成静态链接的二进制文件:无需依赖外部动态库,部署极为简单
面向接口而非面向继承
-
接口(interface)是隐式实现 :只要实现了接口的方法集合,就自动实现该接口。
-
组合优于继承 :通过结构体嵌套实现代码复用,避免传统 OOP 中继承的复杂性。
Go和Java的联系和区别
Go和Java的相似之处
- 静态类型语言 :Java 和 Go 都是静态类型语言,变量类型在编译时确定,便于类型检查。
- 支持跨平台
- Java 运行于 JVM,由JVM将统一的字节码解释成机器码
- Go 编译器允许通过设置环境变量,编译出适用于 不同操作系统和架构 的二进制文件,从而支持跨平台开发。
- 自动垃圾回收 :两者都具备 GC(Garbage Collection)机制,自动管理内存。
Go和Java的区别
- 并发模型
- Java:使用线程 + 线程池,较重,需显式管理
- Go:使用
goroutine
+channel
,轻量且原生支持 CSP 模型
- 面向对象
- Java:典型的 OOP(支持继承、多态、接口)
- Go:不支持类和继承,使用结构体 + 接口组合实现面向对象
- 部署难度
- Java:通常打包为
.jar
、.war
,依赖 JRE 环境运行 - Go:编译为单个可执行文件,部署非常方便
- Java:通常打包为
Go的环境变量
可通过命令查看和修改环境变量
|
|
基本路径
GOROOT
:Go 安装目录(包含编译器、标准库等)默认由安装器自动设置,一般不需要修改GOPATH
:工作目录,用于存放源码、依赖、可执行文件GOBIN
:安装可执行文件的目录
模块管理
GOPROXY
:模块代理地址,解决模块下载慢的问题GO111MODULE
:模块启用策略
Go的编译执行过程
命令行执行
- 编译 :通过
go build
命令将.go
文件编译成.exe
文件,go build -o
可以指定可执行文件的名称 - 执行 :运行
.exe
文件 - 编译同时执行:
go run
将.go
文件直接编译同时运行
Go支持跨平台构建,因此可以在一个平台上构建出针对不同平台的可执行文件
通过临时修改环境变量来构建出针对不同平台的可执行文件
|
|
可执行文件的类型
- Windows:
.exe
文件 - Mac OS/Linux:无后缀名的文件
跨平台性
Go和Java一样支持 一次编译,处处运行
相比于Java根据不同平台设计不同的虚拟机来解释字节码的做法,Go 采用 静态编译(Static Compilation) 的策略
源代码 → 本地平台的完整二进制可执行文件,不依赖任何外部动态库或虚拟机。
这意味着生成的程序在目标平台上运行时不需要安装 Go 语言环境,也不需要共享库(.so/.dll),从而使跨平台部署变得非常容易。
Go实现跨平台性的原理是因为Go 编译器(主要是 cmd/compile
和 cmd/link
)支持多个目标平台架构(GOOS + GOARCH),并且这些后端已经内置在 Go 安装包中,不需要你手动安装交叉编译工具链(如 gcc-arm
)。
比如,在 macOS 上安装 Go 后,你就能直接构建 Linux、Windows、Android、WASM 等平台的可执行文件。
在构建可执行文件时,通过设置环境变量实现平台切换
GOOS
: 控制目标操作系统(如 linux、windows、darwin、android 等)GOARCH
:控制目标架构(如 amd64、arm64、386 等)
Go 编译器根据这两个变量,选择对应的:
- 标准库实现(如
syscall_linux.go
、syscall_windows.go
) - 汇编指令集
- 系统调用桥接层
- 链接器策略
go build和go run的区别
- 如果先使用
go build
编译生成了可执行文件,那么可以将该可执行文件拷贝到没有 go 开发环境的机器上,仍然可以运行 - 如果我们是直接
go run
源代码,那么如果要在另外一个机器上这么运行,也需要 go 开发环境,否则无法执行。相当于编译到临时目录 + 执行后删除 - 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件变大了很多。