Go 语言入门指南:基础语法和常用特性解析 | 豆包MarsCode AI刷题

74 阅读5分钟

一、Go 语言简介

Go 语言(也称为 Golang)是谷歌开发的一种开源编程语言,它具有高效、简洁、并发性强等诸多优点。Go 语言的设计目标是构建具有简单、高效、可靠且易于维护的软件系统,在网络编程、云计算、分布式系统等领域应用广泛。

二、基础语法

(一)变量声明与赋值

  1. 声明变量

    • 在 Go 语言中,可以使用var关键字声明变量。例如:var a int,这里声明了一个名为a的整数类型变量。变量在声明后会被自动初始化为其类型的零值,对于int类型,零值是0
    • 也可以同时声明多个变量,如var b, c string,声明了两个字符串类型变量bc
  2. 变量赋值

    • 可以使用=运算符给变量赋值。例如:a = 10,将10赋给变量a
    • 还可以在声明变量时就进行赋值,这被称为初始化。如var d = 5,或者使用更简洁的短变量声明方式e := 6(这种方式只能在函数内部使用)。

(二)数据类型

  1. 基本数据类型

    • 整数类型:包括int(有符号整数)、uint(无符号整数)等,根据不同的平台,它们的大小可能会有所不同。例如,在 32 位系统上,int可能是 32 位,在 64 位系统上可能是 64 位。此外还有int8int16int32int64uint8uint16uint32uint64等明确大小的整数类型。
    • 浮点数类型float32float64,其中float32占用 4 个字节,float64占用 8 个字节,float64的精度更高。例如:var f float32 = 3.14var g float64 = 3.1415926
    • 布尔类型:只有truefalse两个值,用于表示逻辑判断的结果。如var h bool = true
    • 字符串类型:使用双引号"或反引号 ``` 包裹。双引号中的字符串支持转义字符,而反引号中的字符串是原始字符串,不支持转义。例如:var i string = "Hello, World!"var j string = This is a raw string`。
  2. 复合数据类型

    • 数组:是具有相同类型的元素的集合。例如:var arr [5]int声明了一个包含 5 个整数的数组。可以通过索引来访问数组元素,如arr[0] = 1
    • 切片:切片是对数组的引用,它可以动态地增长和收缩。例如:var slice []int = arr[1:3],这里创建了一个切片,它引用了arr数组中索引从 1 到 2(不包括 3)的元素。切片可以使用append函数来添加元素,如slice = append(slice, 4)
    • 结构体:用于组合不同类型的数据。例如:
type Person struct {
    Name string
    Age  int
}
var p Person
p.Name = "Alice"
p.Age = 20

定义了一个Person结构体,包含NameAge两个字段,并创建了一个Person类型的变量p,然后给其字段赋值。

(三)控制流语句

  1. 条件语句

    • if 语句:用于根据条件执行不同的代码块。例如:

if a > 5 {
    println("a is greater than 5")
} else {
    println("a is less than or equal to 5")
}
  • 可以在if语句中添加初始化语句,如if b := 3; b > 2 {println("b is greater than 2")},这里b的作用域仅限于if语句块。

  1. 循环语句

    • for 循环:Go 语言中的for循环有多种形式。最常见的形式是:

for i := 0; i < 10; i++ {
    println(i)
}

这里初始化变量i0,只要i小于10,就执行循环体,每次循环后i自增 1。

  • 也可以省略初始化语句和后置操作语句,形成一个类似while循环的形式,如j := 0; for j < 5 {println(j); j++}

  • 还有一种for - range循环,用于遍历数组、切片、字符串等可迭代的数据类型。例如,遍历一个切片:

slice := []int{1, 2, 3}
for index, value := range slice {
    println("Index:", index, "Value:", value)
}

三、常用特性

(一)函数

  1. 函数定义

    • 函数是 Go 语言中的基本代码块,用于封装一段可重复执行的代码。函数定义的一般形式为:

func functionName(parameters) returnType {
    // 函数体
    return value
}

例如:

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

定义了一个名为add的函数,它接受两个int类型的参数ab,并返回它们的和。
2. 函数参数传递

  • Go 语言中的函数参数传递是值传递。这意味着在函数内部对参数的修改不会影响到函数外部的变量。例如:

func modify(x int) {
    x = 10
}
var y int = 5
modify(y)
println(y) // 输出仍然是5
  • 但是如果参数是指针类型,就可以在函数内部修改函数外部变量的值。例如:

func modifyPointer(x *int) {
    *x = 10
}
var z int = 5
modifyPointer(&z)
println(z) // 输出是10

(二)并发编程

  1. Go 协程(Goroutine)

    • Go 协程是 Go 语言中轻量级的线程。使用go关键字就可以启动一个协程。例如:

func printNumbers() {
    for i := 0; i < 10; i++ {
        println(i)
    }
}
func main() {
    go printNumbers()
    // 主协程可以继续执行其他任务
    for i := 0; i < 5; i++ {
        println("Main:", i)
    }
}

这里在main函数中启动了一个协程来执行printNumbers函数,同时main协程继续执行自己的循环。
2. 通道(Channel)

  • 通道用于协程之间的通信和同步。通道有两种类型:无缓冲通道和有缓冲通道。

  • 无缓冲通道:无缓冲通道在发送和接收操作时会阻塞,直到对方准备好。例如:

ch := make(chan int)
go func() {
    ch <- 1
}()
value := <-ch
println(value)

这里创建了一个无缓冲通道ch,在一个协程中向通道发送一个整数1,在主协程中从通道接收这个整数并打印。

  • 有缓冲通道:有缓冲通道在缓冲区未满或未空时,发送和接收操作不会阻塞。例如:bufferedCh := make(chan int, 5)创建了一个可以容纳 5 个整数的有缓冲通道。

对Go的理解还不够怎么办,革命尚未成功,同志仍需努力。