Go 语言入门指南:基础语法和常用特性解析

65 阅读4分钟

Go 语言入门指南:基础语法和常用特性解析

Go 语言(Golang)是一种开源编程语言,由 Google 开发。它因其简单、并发性强和高效等特点,广受开发者欢迎。本文将介绍 Go 语言的基础语法和常用特性,并对每段代码进行详细解释。

一、Go 语言的基本特性

  1. 静态类型和编译型语言:Go 是静态类型的编译型语言,这意味着在编译时会进行类型检查,编译后生成二进制可执行文件。
  2. 简洁的语法:Go 的语法简洁,强调代码的可读性,减少了不必要的符号和复杂结构。
  3. 内置并发支持:Go 提供了 goroutine 和 channel 来实现并发编程,简化了多线程开发的复杂度。
  4. 自动垃圾回收:Go 语言内置垃圾回收机制,开发者不需要手动管理内存。

二、Go 程序的基本结构

一个简单的 Go 程序示例如下:

package main

import "fmt"

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

代码解释:

  • package main:每个 Go 程序都必须有一个 main 包,它是程序的入口。
  • import "fmt":导入标准库 fmt 包,用于格式化输出。
  • func main():定义 main 函数,这是程序的起点。
  • fmt.Println("Hello, World!"):调用 fmt 包中的 Println 函数输出字符串 "Hello, World!"。

三、变量和常量

Go 语言使用 var 关键字声明变量,const 声明常量。示例如下:

package main

import "fmt"

func main() {
    var a int = 10        // 声明变量 a,类型为 int,值为 10
    var b = 20            // 声明变量 b,类型自动推断为 int
    c := 30               // 使用简短声明方式声明变量 c

    const pi = 3.14       // 声明常量 pi,值为 3.14

    fmt.Println(a, b, c, pi)
}

代码解释:

  • var a int = 10:声明了一个类型为 int 的变量 a 并赋值为 10。
  • var b = 20:声明变量 b,Go 会自动推断 b 的类型为 int
  • c := 30:使用 := 进行简短声明,省略了 var 关键字。
  • const pi = 3.14:声明了一个常量 pi,在程序中不可更改其值。

四、数据类型

Go 提供了多种数据类型,常见的有:

  • 基本类型:intfloat64stringbool
  • 复合类型:arrayslicemapstruct

示例:

package main

import "fmt"

func main() {
    var str string = "Go语言"
    var num int = 42
    var isTrue bool = true
    arr := [3]int{1, 2, 3}        // 数组
    slice := []int{4, 5, 6, 7}    // 切片
    myMap := map[string]int{"a": 1, "b": 2}  // 映射

    fmt.Println(str, num, isTrue)
    fmt.Println(arr)
    fmt.Println(slice)
    fmt.Println(myMap)
}

代码解释:

  • var str string = "Go语言":声明一个 string 类型变量 str,值为 "Go语言"。
  • arr := [3]int{1, 2, 3}:声明一个长度为 3 的整型数组。
  • slice := []int{4, 5, 6, 7}:声明一个切片,类似动态数组。
  • myMap := map[string]int{"a": 1, "b": 2}:声明一个映射,键类型为 string,值类型为 int

五、控制结构

Go 支持常见的控制结构,如 if-elsefor 循环和 switch 语句。

if-else 示例:

package main

import "fmt"

func main() {
    num := 10
    if num > 5 {
        fmt.Println("num 大于 5")
    } else {
        fmt.Println("num 小于或等于 5")
    }
}

代码解释:

  • if num > 5:如果 num 大于 5,执行 fmt.Println("num 大于 5")
  • else 块在条件为 false 时执行。

for 循环示例:

package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println("i:", i)
    }
}

代码解释:

  • for i := 0; i < 5; i++for 循环,从 0 迭代到 4。

switch 示例:

package main

import "fmt"

func main() {
    day := "Monday"
    switch day {
    case "Monday":
        fmt.Println("今天是星期一")
    case "Tuesday":
        fmt.Println("今天是星期二")
    default:
        fmt.Println("其他天")
    }
}

代码解释:

  • switch day:根据 day 的值选择要执行的 case 分支。
  • default:当没有匹配的 case 时执行。

六、函数

Go 中函数使用 func 关键字定义,支持多返回值。

示例:

package main

import "fmt"

func add(a int, b int) int {
    return a + b
}

func swap(x, y string) (string, string) {
    return y, x
}

func main() {
    sum := add(3, 4)
    fmt.Println("Sum:", sum)

    a, b := swap("hello", "world")
    fmt.Println("Swapped:", a, b)
}

代码解释:

  • func add(a int, b int) int:定义了一个返回 int 类型的函数 add
  • func swap(x, y string) (string, string):定义了一个返回两个 string 值的函数 swap

七、指针

Go 支持指针,用于指向变量的内存地址。

示例:

package main

import "fmt"

func main() {
    x := 10
    p := &x       // p 是指向 x 的指针
    fmt.Println("x 的值:", x)
    fmt.Println("p 指向的值:", *p)

    *p = 20       // 通过指针修改 x 的值
    fmt.Println("修改后的 x 的值:", x)
}

代码解释:

  • p := &xp 存储了变量 x 的地址。
  • *p = 20:通过指针 p 修改 x 的值为 20。

八、goroutine 和并发

Go 使用 goroutine 实现轻量级并发。

示例:

package main

import (
    "fmt"
    "time"
)

func sayHello() {
    for i := 0; i < 5; i++ {
        fmt.Println("Hello")
        time.Sleep(100 * time.Millisecond)
    }
}

func main() {
    go sayHello()        // 启动 goroutine