1
Hello World
Go 是一门简洁、高效的编程语言。让我们从经典的 Hello World 开始。
每个 Go 程序都从 main 包的 main 函数开始执行。fmt 包提供了格式化输入输出的功能。
第一个 Go 程序
go
1package main2 3import "fmt"4 5func main() {6 fmt.Println("Hello, World!")7}从零开始学习 Go 语言,掌握核心语法与编程思想
Go 是一门简洁、高效的编程语言。让我们从经典的 Hello World 开始。
每个 Go 程序都从 main 包的 main 函数开始执行。fmt 包提供了格式化输入输出的功能。
1package main2 3import "fmt"4 5func main() {6 fmt.Println("Hello, World!")7}Go 是静态类型语言,每个变量都有明确的类型。Go 提供了多种声明变量的方式。
使用 var 关键字可以显式声明变量,也可以使用 := 短声明语法让编译器自动推断类型。
1package main2 3import "fmt"4 5func main() {6 // 显式类型声明7 var name string = "Gopher"8 var age int = 109 10 // 类型推断11 city := "Beijing"12 13 // 多变量声明14 var x, y int = 1, 215 16 // 常量17 const Pi = 3.1415918 19 fmt.Println(name, age, city, x, y, Pi)20}1// 数值类型2var i int = 423var f float64 = 3.144var c complex128 = 1 + 2i5 6// 布尔类型7var b bool = true8 9// 字符串10var s string = "Hello"11 12// 类型转换13var n float64 = float64(i)Go 的控制流语句包括 if、for 和 switch。值得注意的是,Go 只有 for 循环,没有 while 循环。
if 语句可以在条件之前执行一个简短语句,该语句声明的变量作用域仅在 if 块内。
1package main2 3import "fmt"4 5func main() {6 x := 107 8 // 基本 if9 if x > 5 {10 fmt.Println("x 大于 5")11 }12 13 // if 带初始化语句14 if y := x * 2; y > 15 {15 fmt.Println("y 大于 15")16 }17 18 // switch 语句19 switch x {20 case 1:21 fmt.Println("一")22 case 10:23 fmt.Println("十")24 default:25 fmt.Println("其他")26 }27}1package main2 3import "fmt"4 5func main() {6 // 标准 for 循环7 for i := 0; i < 5; i++ {8 fmt.Println(i)9 }10 11 // while 风格12 n := 013 for n < 5 {14 n++15 }16 17 // 无限循环18 // for { }19 20 // range 遍历21 nums := []int{1, 2, 3}22 for i, v := range nums {23 fmt.Println(i, v)24 }25}Go 的函数可以返回多个值,这是 Go 的一大特色。多返回值常用于返回结果和错误。
Go 支持闭包和匿名函数,函数是一等公民,可以作为参数传递。
1package main2 3import "fmt"4 5// 基本函数6func add(a, b int) int {7 return a + b8}9 10// 多返回值11func divide(a, b float64) (float64, error) {12 if b == 0 {13 return 0, fmt.Errorf("除数不能为零")14 }15 return a / b, nil16}17 18// 命名返回值19func split(sum int) (x, y int) {20 x = sum * 4 / 921 y = sum - x22 return23}24 25func main() {26 fmt.Println(add(1, 2))27 28 result, err := divide(10, 2)29 if err != nil {30 fmt.Println(err)31 }32 fmt.Println(result)33}1package main2 3import "fmt"4 5// 返回一个闭包6func counter() func() int {7 count := 08 return func() int {9 count++10 return count11 }12}13 14// 函数作为参数15func apply(nums []int, fn func(int) int) []int {16 result := make([]int, len(nums))17 for i, v := range nums {18 result[i] = fn(v)19 }20 return result21}22 23func main() {24 c := counter()25 fmt.Println(c()) // 126 fmt.Println(c()) // 227 28 double := func(x int) int { return x * 2 }29 nums := []int{1, 2, 3}30 fmt.Println(apply(nums, double)) // [2, 4, 6]31}Go 没有异常机制,而是通过返回 error 类型来处理错误。这种显式的错误处理方式使代码更加清晰。
error 是一个接口类型,只有一个 Error() 方法返回错误信息字符串。
1package main2 3import (4 "errors"5 "fmt"6)7 8// 定义错误9var ErrNotFound = errors.New("not found")10 11func findUser(id int) (string, error) {12 if id <= 0 {13 return "", ErrNotFound14 }15 return "User", nil16}17 18func main() {19 user, err := findUser(0)20 if err != nil {21 if errors.Is(err, ErrNotFound) {22 fmt.Println("用户不存在")23 }24 return25 }26 fmt.Println(user)27}1package main2 3import "fmt"4 5// 自定义错误类型6type ValidationError struct {7 Field string8 Message string9}10 11func (e *ValidationError) Error() string {12 return fmt.Sprintf("%s: %s", e.Field, e.Message)13}14 15func validate(name string) error {16 if name == "" {17 return &ValidationError{18 Field: "name",19 Message: "不能为空",20 }21 }22 return nil23}24 25func main() {26 if err := validate(""); err != nil {27 fmt.Println(err) // name: 不能为空28 }29}