🎯 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,可以实现不同的goroutine之间的相互通信
🐍 类似 Python 的语法
- 函数可以返回多个值
🚀 编译部署效率快
- 编译速度快:Go 的编译器非常高效,即使是大型项目也能快速编译
- 生成静态链接的二进制文件:无需依赖外部动态库,部署极为简单
🔌 面向接口而非面向继承
- 接口(interface)是隐式实现:只要实现了接口的方法集合,就自动实现该接口
- 组合优于继承:通过结构体嵌套实现代码复用,避免传统 OOP 中继承的复杂性
💼 为什么很多后端项目会选择 Go
从工程实践的角度看,Go 常被选择并不只是因为“语法简单”,而是因为它在开发效率、运行效率和部署效率之间取得了比较均衡的结果:
- 语法与标准库克制:语言特性少而稳定,团队成员更容易统一代码风格和协作习惯
gofmt带来的统一格式:减少了无意义的风格争论,代码评审更聚焦于逻辑本身- 并发模型直接内建:通过
goroutine和channel能以较低心智负担写出高并发程序 - GC 友好:具备自动垃圾回收能力,降低了内存管理门槛,同时延续了静态编译语言的性能优势
- 交付简单:通常可以直接生成单个可执行文件,部署、迁移和容器化都比较直接
如果把这类问题放在面试语境里回答,可以概括成一句话:
Go 更像是一门“偏工程化”的语言,牺牲了一部分语法自由度,换来更稳定的协作体验和更低的系统交付成本。
🔍 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 开发环境,否则无法执行。相当于编译到临时目录 + 执行后删除 - 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件变大了很多