Go的语言特性

Golang的语言特性和与Java的比较

🎯 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 带来的统一格式:减少了无意义的风格争论,代码评审更聚焦于逻辑本身
  • 并发模型直接内建:通过 goroutinechannel 能以较低心智负担写出高并发程序
  • GC 友好:具备自动垃圾回收能力,降低了内存管理门槛,同时延续了静态编译语言的性能优势
  • 交付简单:通常可以直接生成单个可执行文件,部署、迁移和容器化都比较直接

如果把这类问题放在面试语境里回答,可以概括成一句话:

Go 更像是一门“偏工程化”的语言,牺牲了一部分语法自由度,换来更稳定的协作体验和更低的系统交付成本。


🔍 Go 和 Java 的联系和区别

🤝 Go 和 Java 的相似之处

  • 静态类型语言JavaGo 都是静态类型语言,变量类型在编译时确定,便于类型检查
  • 支持跨平台
    • Java 运行于 JVM,由 JVM 将统一的字节码解释成机器码
    • Go 编译器允许通过设置环境变量,编译出适用于不同操作系统和架构的二进制文件,从而支持跨平台开发
  • 自动垃圾回收:两者都具备 GC(Garbage Collection)机制,自动管理内存

⚖️ Go 和 Java 的区别

  • 并发模型
    • Java:使用线程 + 线程池,较重,需显式管理
    • Go:使用 goroutine + channel,轻量且原生支持 CSP 模型
  • 面向对象
    • Java:典型的 OOP(支持继承、多态、接口)
    • Go:不支持类和继承,使用结构体 + 接口组合实现面向对象
  • 部署难度
    • Java:通常打包为 .jar.war,依赖 JRE 环境运行
    • Go:编译为单个可执行文件,部署非常方便

⚙️ Go 的环境变量

可通过命令查看和修改环境变量:

1
2
go env #查看环境变量
go env -w #永久修改全局环境变量

📁 基本路径

  • GOROOTGo 安装目录(包含编译器、标准库等),默认由安装器自动设置,一般不需要修改
  • GOPATH:工作目录,用于存放源码、依赖、可执行文件
  • GOBIN:安装可执行文件的目录

📋 模块管理

  • GOPROXY:模块代理地址,解决模块下载慢的问题
  • GO111MODULE:模块启用策略

🔨 Go 的编译执行过程

💻 命令行执行

  • 编译:通过 go build 命令将 .go 文件编译成 .exe 文件,go build -o 可以指定可执行文件的名称
  • 执行:运行 .exe 文件
  • 编译同时执行:go run.go 文件直接编译同时运行

Go 支持跨平台构建,因此可以在一个平台上构建出针对不同平台的可执行文件。

通过临时修改环境变量来构建出针对不同平台的可执行文件:

1
2
3
set GOOS=linux
set GOARCH=amd64
set CGO_ENABLED=0

可执行文件的类型:

  • Windows.exe 文件
  • Mac OS/Linux:无后缀名的文件

🌐 跨平台性

GoJava 一样支持一次编译,处处运行

相比于 Java 根据不同平台设计不同的虚拟机来解释字节码的做法,Go 采用静态编译(Static Compilation) 的策略:

源代码 → 本地平台的完整二进制可执行文件,不依赖任何外部动态库或虚拟机。

这意味着生成的程序在目标平台上运行时不需要安装 Go 语言环境,也不需要共享库(.so/.dll),从而使跨平台部署变得非常容易。

Go 实现跨平台性的原理是因为 Go 编译器(主要是 cmd/compilecmd/link)支持多个目标平台架构(GOOS + GOARCH),并且这些后端已经内置在 Go 安装包中,不需要你手动安装交叉编译工具链(如 gcc-arm)。

比如,在 macOS 上安装 Go 后,你就能直接构建 LinuxWindowsAndroidWASM 等平台的可执行文件。

在构建可执行文件时,通过设置环境变量实现平台切换

  • GOOS:控制目标操作系统(如 linux、windows、darwin、android 等)
  • GOARCH:控制目标架构(如 amd64、arm64、386 等)

Go 编译器根据这两个变量,选择对应的:

  • 标准库实现(如 syscall_linux.gosyscall_windows.go
  • 汇编指令集
  • 系统调用桥接层
  • 链接器策略

📊 go build 和 go run 的区别

  • 如果先使用 go build 编译生成了可执行文件,那么可以将该可执行文件拷贝到没有 Go 开发环境的机器上,仍然可以运行
  • 如果我们是直接 go run 源代码,那么如果要在另外一个机器上这么运行,也需要 Go 开发环境,否则无法执行。相当于编译到临时目录 + 执行后删除
  • 在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件变大了很多
最后更新于 2026-03-27 03:34 UTC
그 경기 끝나고 좀 멍하기 있었는데 여러분 이제 살면서 여러가
使用 Hugo 构建
主题 StackJimmy 设计