1、Go语言入门:从零开始,搭建你的Go开发环境

大家好,我是你们的老朋友。今天咱们正式开启Go语言的学习之旅。

说实话,我接触Go语言已经有七八年了。从最初的好奇,到后来成为主力开发语言,Go给我的感觉一直是「简洁、高效、不啰嗦」。你想想看,一门语言能把并发写得这么优雅,编译速度还快得离谱,这在后端开发里简直是降维打击。

好,咱们不废话,直接进入正题。

1.1 Go语言发展史:一个「编译快、并发强」的诞生故事

Go语言诞生于2007年的Google。当时Google的几位大佬——Rob Pike、Ken Thompson(对,就是Unix和C语言的联合发明人)、Robert Griesemer——在等C++编译的时候,实在受不了了。

Rob Pike后来在一次演讲里说:「我们等一个编译,喝了两杯咖啡,它还没好。」

于是他们决定自己搞一门语言。目标很明确:

  • 编译速度要快——不能像C++那样动辄几分钟
  • 并发要简单——不能像Java那样写个线程池还要一堆模板代码
  • 跨平台要容易——一次编译,到处运行

2009年,Go正式对外开源。2012年,Go 1.0发布,标志着它进入了稳定期。

我记得2015年左右,Docker和Kubernetes都用Go重写了,那时候Go一下子火了起来。说白了,云原生时代的基石,就是用Go砌起来的。

核心时间线:

  • 2007年:项目启动
  • 2009年:开源发布
  • 2012年:Go 1.0 稳定版
  • 2015年:Docker、Kubernetes 推动Go爆发
  • 2022年:Go 1.18 引入泛型

1.2 Go语言核心优势:为什么我推荐你学Go?

很多新手问我:「Go到底好在哪?」我一般会从三个角度回答。

1. 并发——天生的「轻量级多任务」

Go的并发模型叫Goroutine。你可以把它理解成一个「超级轻量级的线程」。启动一个Goroutine只需要几KB的内存,而Java的线程要几MB。

我在项目中遇到过需要同时处理上万条WebSocket连接的情况。用Java?线程池直接炸了。用Go?开一万个Goroutine,内存才几十MB,稳得很。

小提示:Goroutine不是线程,它是Go运行时管理的协程。你写并发代码时,只需要在函数前面加一个 go 关键字就行。

2. 编译速度——「秒级编译」不是梦

Go的编译器是自举的(用Go写Go编译器)。它的编译速度有多快?一个中等规模的项目,从敲完代码到生成可执行文件,通常只需要几秒钟。

我曾经维护过一个C++项目,改一行代码,编译+链接要等3分钟。换成Go之后,同样的改动,3秒搞定。你想想看,这效率差距有多大。

3. 跨平台——「一次编译,到处运行」

Go支持交叉编译。你在Windows上可以编译出Linux的可执行文件,在Mac上可以编译出Windows的exe。只需要设置两个环境变量:GOOSGOARCH

举个例子:在Mac上编译Linux的64位程序

GOOS=linux GOARCH=amd64 go build -o myapp

嗯,这里要注意:Go的跨平台不是靠虚拟机,而是直接编译成目标平台的机器码。所以性能几乎没有损失。

1.3 Go开发环境搭建:GOROOT、GOPATH、Go Modules

搭建环境是每个新手的第一道坎。别怕,我带你一步步走。

1. 下载与安装

去Go官网(golang.org)下载对应操作系统的安装包。Windows是msi,Mac是pkg,Linux是tar.gz。

我个人习惯用Linux开发,所以一般这样安装:

wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc

2. GOROOT 和 GOPATH

这两个概念,很多新手容易搞混。我简单解释一下:

  • GOROOT:Go的安装目录。一般不用手动设置,安装程序会自动配好。
  • GOPATH:你的工作目录。Go 1.11之前,所有项目代码必须放在GOPATH/src下。现在有了Go Modules,GOPATH基本只用来存放下载的依赖包。

避坑指南:我曾经在GOPATH上踩过坑。早期版本要求GOPATH必须是一个绝对路径,而且不能有空格。如果你用Windows,千万别把Go项目放在「C:\Program Files」这种带空格的目录下。

3. Go Modules——现代Go的依赖管理

从Go 1.11开始,Go引入了Modules机制。说白了,就是每个项目可以独立管理自己的依赖版本,不再受GOPATH的约束。

初始化一个模块很简单:

mkdir myproject
cd myproject
go mod init myproject

这会生成一个 go.mod 文件。以后你引入第三方包,比如 import "github.com/gin-gonic/gin",Go会自动下载并记录版本到 go.sum 文件中。

我的习惯:每次新建项目,第一件事就是 go mod init。这样依赖管理就清晰了,不会出现「在我电脑上能跑」的尴尬情况。

1.4 第一个Go程序:Hello, World!

好了,环境搭好了,咱们写个程序试试手。

1. 创建项目目录

mkdir hello
cd hello
go mod init hello

2. 编写代码

新建一个 main.go 文件,输入以下内容:

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

解释一下:

  • package main:每个Go文件都必须属于一个包。main包是特殊的,它告诉Go这是一个可执行程序。
  • import "fmt":引入标准库中的fmt包,用来格式化输出。
  • func main():程序的入口函数。程序从这里开始执行。
  • fmt.Println(...):打印一行文本。

3. 编译并运行

go build
./hello

或者一步到位:

go run main.go

看到终端输出 Hello, World! 了吗?恭喜你,第一个Go程序跑起来了。

小细节:go build 会生成一个可执行文件,而 go run 是直接编译并运行,不生成文件。开发时用 go run 更方便,部署时用 go build

1.5 本章小结

这一章我们聊了Go的诞生背景、核心优势,也亲手搭建了开发环境,跑通了第一个程序。

你可能会觉得:「就这?Hello World也太简单了吧。」

没错,Go的哲学就是「简单」。但简单不等于简陋。后面几章,我们会逐步深入,看看Go的并发、接口、错误处理这些真正强大的特性。

下一章,咱们聊聊Go的基础语法——变量、类型、控制流。这些东西看似基础,但很多坑都在里面。到时候我会分享一些我踩过的雷,保证让你少走弯路。

课后练习:试着修改 fmt.Println 里的内容,打印你自己的名字。然后试试 go buildgo run 的区别。

好,今天就到这里。咱们下章见。