Go 一小时上手指南:从零到运行第一个程序

不废话,直接开始。本文让你在 60 分钟内理解 Go 的核心概念,写出第一个可运行的程序。

为什么选择 Go?

Go 由 Google 开发,专为现代分布式系统和并发编程设计。三个核心特点:

  1. 编译快速:大型项目也能在几秒内编译完成
  2. 并发原生:goroutine 让并发编程变得简单
  3. 部署简单:编译为单个二进制文件,无依赖问题

1. 安装 Go(5 分钟)

直接下载(推荐)

访问 golang.org/dl,选择对应系统:

bash 复制代码
# 验证安装
$ go version
go version go1.21.0 darwin/amd64

或者使用包管理器下载

bash 复制代码
# macOS
brew install go

# Ubuntu/Debian
sudo apt install golang

# Windows (使用 Chocolatey)
choco install golang

环境配置(可选但建议)

bash 复制代码
# 查看安装路径
$ which go
/usr/local/go/bin/go

# 设置工作目录(Go Modules 模式下非必需)
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

重要:Go 1.16+ 默认启用 Go Modules,无需设置 GOPATH。本文使用 Go Modules。

2. 第一个程序(10 分钟)

创建项目目录并初始化模块:

bash 复制代码
mkdir hello-go && cd hello-go
go mod init hello-go

创建 main.go

go 复制代码
// main.go - Go 程序入口必须是 main 包
package main

// 导入标准库包
import "fmt"

// main 函数是程序入口
func main() {
    // 打印输出
    fmt.Println("Hello, Go!")
    
    // 格式化输出
    name := "World"
    fmt.Printf("Hello, %s!\n", name)
}

运行程序:

bash 复制代码
# 方式1:直接运行
go run main.go
# 输出: Hello, Go!
#       Hello, World!

# 方式2:编译后运行
go build -o hello-app
./hello-app

3. 变量与数据类型(15 分钟)

变量声明

Go 是静态类型语言,但支持类型推断:

go 复制代码
package main

import "fmt"

func main() {
    // 方式1:标准声明(类型在后)
    var count int = 10
    
    // 方式2:类型推断
    var message = "Hello"
    
    // 方式3:短变量声明(函数内使用)
    isReady := true
    
    // 方式4:批量声明
    var (
        width  = 100
        height = 50
    )
    
    fmt.Printf("count: %d, message: %s, isReady: %v\n", count, message, isReady)
}

基本数据类型

Go 的数据类型简洁明确:

go 复制代码
func dataTypes() {
    // 整数类型
    var num int = 42          // 平台相关,32或64位
    var age int32 = 30        // 明确32位
    var bigNum int64 = 1<<62  // 大整数
    
    // 浮点数
    var pi float64 = 3.14159
    var price float32 = 19.99
    
    // 布尔值
    var isActive bool = true
    
    // 字符串(不可变)
    var greeting string = "Hello"
    greeting += " Go!"        // 创建新字符串
    
    // 类型转换(必须显式)
    var a int = 42
    var b float64 = float64(a)
    
    fmt.Printf("整数: %d, 浮点: %.2f, 字符串: %s\n", num, pi, greeting)
}

4. 控制结构(15 分钟)

if 语句

go 复制代码
func controlFlow() {
    score := 85
    
    // 基本 if
    if score >= 60 {
        fmt.Println("及格")
    }
    
    // if-else
    if score >= 90 {
        fmt.Println("优秀")
    } else if score >= 70 {
        fmt.Println("良好")
    } else {
        fmt.Println("继续努力")
    }
    
    // if 语句中声明变量(作用域仅限于 if-else)
    if limit := 100; score > limit {
        fmt.Println("超过上限")
    }
}

for 循环

Go 只有 for 循环,但功能强大:

go 复制代码
func loops() {
    // 标准 for 循环
    for i := 0; i < 5; i++ {
        fmt.Printf("迭代 %d\n", i)
    }
    
    // while 风格的循环
    count := 0
    for count < 3 {
        fmt.Printf("计数: %d\n", count)
        count++
    }
    
    // 无限循环
    // for {
    //     fmt.Println("永不停止")
    // }
    
    // 遍历数组/切片
    numbers := []int{10, 20, 30}
    for index, value := range numbers {
        fmt.Printf("索引 %d: 值 %d\n", index, value)
    }
}

switch 语句

比大多数语言更灵活:

go 复制代码
func switches() {
    day := "Wednesday"
    
    // 基础用法
    switch day {
    case "Monday":
        fmt.Println("工作日开始")
    case "Friday":
        fmt.Println("周末快到了")
    case "Saturday", "Sunday":
        fmt.Println("周末")
    default:
        fmt.Println("普通工作日")
    }
    
    // 无表达式的 switch(替代 if-else)
    hour := 14
    switch {
    case hour < 12:
        fmt.Println("上午")
    case hour < 18:
        fmt.Println("下午")
    default:
        fmt.Println("晚上")
    }
}

5. 实战:温度转换程序(10 分钟)

综合运用以上知识,写一个实用程序:

go 复制代码
// temp_converter.go
package main

import (
    "fmt"
    "os"
    "strconv"
)

// 摄氏度转华氏度
func celsiusToFahrenheit(c float64) float64 {
    return c*9/5 + 32
}

// 华氏度转摄氏度
func fahrenheitToCelsius(f float64) float64 {
    return (f - 32) * 5 / 9
}

func main() {
    if len(os.Args) < 3 {
        fmt.Println("用法: go run temp_converter.go <温度> <单位>")
        fmt.Println("示例: go run temp_converter.go 25 C")
        fmt.Println("示例: go run temp_converter.go 77 F")
        return
    }
    
    // 解析命令行参数
    tempStr := os.Args[1]
    unit := os.Args[2]
    
    // 转换为浮点数
    temp, err := strconv.ParseFloat(tempStr, 64)
    if err != nil {
        fmt.Printf("错误: 无效的温度值 '%s'\n", tempStr)
        return
    }
    
    // 根据单位转换
    switch unit {
    case "C", "c":
        f := celsiusToFahrenheit(temp)
        fmt.Printf("%.1f°C = %.1f°F\n", temp, f)
    case "F", "f":
        c := fahrenheitToCelsius(temp)
        fmt.Printf("%.1f°F = %.1f°C\n", temp, c)
    default:
        fmt.Printf("错误: 未知单位 '%s' (请使用 C 或 F)\n", unit)
    }
}

运行示例:

bash 复制代码
# 编译运行
go run temp_converter.go 25 C
# 输出: 25.0°C = 77.0°F

go run temp_converter.go 77 F
# 输出: 77.0°F = 25.0°C

# 错误处理示例
go run temp_converter.go 25
# 输出: 用法: go run temp_converter.go <温度> <单位>

6. 核心要点总结(5 分钟)

Go 语法特点

  1. 类型在后var name string = "Go"
  2. 无分号:编译器自动添加(大部分情况)
  3. 大括号必须if x > 0 { ... }
  4. 导出规则:大写字母开头=公开,小写=私有

快速参考表

go 复制代码
// 变量
x := 10                     // 短声明(函数内)
var y int = 20             // 完整声明

// 常量
const Pi = 3.14

// 控制流
if x > 0 { ... }
for i := 0; i < 10; i++ { ... }
switch x { ... }

// 函数(下篇详细讲)
func add(a, b int) int {
    return a + b
}

常见问题

Q: IDE推荐

A: goland(付费)B VS Code + Go 插件(免费)。

Q: 如何格式化代码?

A: 使用 gofmt

bash 复制代码
# 格式化当前目录所有 Go 文件
gofmt -w .

# 或者使用 go 命令
go fmt ./...

Q: 遇到编译错误怎么办?

A: Go 的错误信息很友好。注意:

  • 未使用的变量会报错(除非用 _ 忽略)
  • 未使用的导入会报错
  • 所有代码必须在包内

进阶思考:尝试修改温度转换程序,添加以下功能:

  1. 支持命令行标志解析(如 -c 25
  2. 添加帮助信息(-h 参数)
  3. 支持批处理模式(从文件读取多个温度)

下一篇预告:Go 函数与错误处理实战------学习如何编写可复用、健壮的 Go 代码。


记住:Go 的设计哲学是"少即是多"。你刚刚学到的语法已经能解决 80% 的实际问题。

相关推荐
飞机和胖和黄2 小时前
王道C语言第一周作业
c语言·开发语言
lly2024062 小时前
SQLite 安装指南
开发语言
星火开发设计2 小时前
C++ deque 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识
河码匠2 小时前
Django rest framework 自定义url
后端·python·django
JaguarJack2 小时前
2026 年 PHP 8.4 依然重要:跳到 8.5 之前你该掌握的特性
后端·php·服务端
程序员爱钓鱼2 小时前
Node.js 博客系统实战(一):项目需求分析
前端·后端·node.js
ID_180079054732 小时前
除了Python,还有哪些语言可以解析淘宝商品详情API返回的JSON数据?
开发语言·python·json
BingoGo2 小时前
2026 年 PHP 8.4 依然重要:跳到 8.5 之前你该掌握的特性
后端·php
草莓熊Lotso2 小时前
Qt 信号与槽深度解析:从基础用法到高级实战(含 Lambda 表达式)
java·运维·开发语言·c++·人工智能·qt·数据挖掘