Go 语言入门指南:基础语法2 | 豆包MarsCode AI刷题

114 阅读3分钟

Go 语言入门指南:基础语法2

1. 函数

函数是可重用的代码块,用于实现特定的功能。Go 语言支持普通函数、匿名函数和闭包。

代码如下:

package main

import "fmt"

func max(n1, n2 int) int {
    if n1 > n2 {
        return n1
    }
    return n2
}

func main() {
    fmt.Println(max(1, 10))  // 10
    fmt.Println(max(-1, -2)) // -1
}

2. 函数作为参数

函数可以作为参数传递。

代码如下

package main

import "fmt"

func test(fn func() int) int {
    return fn()
}

func main() {
    result := test(func() int { return 100 })
    fmt.Println(result) // 100
}

3. 函数返回值

Go 语言支持多个返回值。

代码如下:

package main

import "fmt"

func sum(a, b int) (int, int) {
    return a + b, a - b
}

func main() {
    a, b := sum(5, 3)
    fmt.Println(a, b) //  8 2
}

4. 匿名函数

匿名函数是没有名字的函数,可以作为值使用。

代码如下:

package main

import "fmt"

func main() {
    getSqrt := func(a float64) float64 {
        return a * a
    }
    fmt.Println(getSqrt(4)) //  16
}

5. 闭包

闭包是函数和引用其外部变量的环境。

代码如下:

package main

import "fmt"

func counter() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}

func main() {
    next := counter()
    fmt.Println(next()) //  1
    fmt.Println(next()) //  2
}

6. 延迟调用

defer 语句用于延迟执行,通常用于资源清理。

代码如下:

package main

import "fmt"

func main() {
    defer fmt.Println("World")
    fmt.Println("Hello") // 输出: Hello
    // 输出: World 在 main 结束时执行
}

7. 异常处理

Go 使用 panicrecover 处理异常。

代码如下:

package main

import "fmt"

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Recovered from:", err)
        }
    }()

    panic("This is a panic error!")
    fmt.Println("This line will not be executed.")
}

8. 使用 error 类型

Go 语言使用 error 类型来表示可恢复的错误。

代码如下:

package main

import (
    "errors"
    "fmt"
)

var ErrDivByZero = errors.New("division by zero")

func div(x, y int) (int, error) {
    if y == 0 {
        return 0, ErrDivByZero
    }
    return x / y, nil
}

func main() {
    if result, err := div(10, 0); err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }
}

总结

  • 使用 panic:用于不可恢复的错误,如程序逻辑错误。
  • 使用 error:用于可恢复的错误,允许调用者处理错误。

在 Go 语言中,结构体是一种非常重要的复合数据类型,它允许你将多个字段组合在一起,从而创建更复杂的数据模型。以下是对结构体及其相关概念的简要介绍和示例。

9. 结构体

结构体是由零个或多个字段组成的复合类型。每个字段都有自己的类型和值。

代码如下

package main

import "fmt"

type Point struct {
    X int
    Y int
}

func main() {
    p := Point{X: 1, Y: 2}
    fmt.Printf("Point: %+v\n", p) 
}

9.1 实例化

实例化结构体是指根据结构体定义创建一个具体的结构体对象。

基本实例化

package main

import "fmt"

type Point struct {
    X int
    Y int
}

func main() {
    var p Point // 默认值为零值
    fmt.Printf("X: %d, Y: %d\n", p.X, p.Y) // 输出: X: 0, Y: 0
}

使用字面量实例化

package main

import "fmt"

type Point struct {
    X int
    Y int
}

func main() {
    p := Point{X: 1, Y: 2}
    fmt.Printf("X: %d, Y: %d\n", p.X, p.Y) // 输出: X: 1, Y: 2
}

使用 new 关键字

package main

import "fmt"

type Player struct {
    Name       string
    HealthPoint int
    MagicPoint int
}

func main() {
    tank := new(Player) // 创建指向 Player 的指针
    tank.Name = "Warrior"
    tank.HealthPoint = 300
    fmt.Printf("Player: %+v\n", *tank) // 输出: Player: {Name:Warrior HealthPoint:300 MagicPoint:0}
}

9.2 匿名结构体

匿名结构体没有类型名称,可以直接定义和使用。

代码如下:

package main

import "fmt"

// 打印消息类型
func printMsgType(msg *struct {
    id   int
    data string
}) {
    fmt.Printf("Type: %T, Value: %+v\n", msg, msg)
}

func main() {
    // 实例化一个匿名结构体
    msg := &struct {
        id   int
        data string
    }{
        id:   1024,
        data: "hello",
    }
    printMsgType(msg) // 输出: Type: &struct { id int; data string }, Value: &{id:1024 data:hello}
}