Golang入门基础内容(补档)

132 阅读4分钟

1. Hello, Go!

我们首先来编写一个经典的Hello World程序,让我们熟悉Go语言的基础结构:

goCopy code
package main

import "fmt"

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

在Go语言中,每个程序都由包(package)组成,main 是一个特殊的包名,用于标识可执行程序的入口点。import "fmt" 引入了一个标准库中的包,用于输出信息。fmt.Println() 函数用于在控制台输出"Hello, Go!"。

2. 变量与常量

Go语言是静态类型的语言,但其变量声明方式相对灵活。例如:

goCopy code
package main

import "fmt"

func main() {
    var name string = "John"
    age := 30
    const pi = 3.14159

    fmt.Println("Name:", name)
    fmt.Println("Age:", age)
    fmt.Println("π:", pi)
}

在上面的例子中,我们演示了三种不同的变量声明方式。var 关键字用于声明变量的类型,:= 用于自动推断变量类型,并进行赋值。const 用于声明常量,常量的值在声明后不可更改。

3. 条件语句与循环

Go语言的条件语句和循环结构与其他语言类似,但有一些特殊之处。

条件语句(if-else)

goCopy code
package main

import "fmt"

func main() {
    age := 18

    if age >= 18 {
        fmt.Println("成年")
    } else {
        fmt.Println("未成年")
    }
}

循环(for)

goCopy code
package main

import "fmt"

func main() {
    for i := 1; i <= 5; i++ {
        fmt.Println("当前数字:", i)
    }
}

Go语言中没有while循环,但for循环可以实现类似功能。此外,Go语言的for循环还可以用于迭代数组、切片、字典等数据结构。

4. 数组与切片

Go语言中的数组和切片是常用的数据结构,可以用于存储一组数据。

数组

goCopy code
package main

import "fmt"

func main() {
    var arr [5]int
    arr[0] = 1
    arr[1] = 2
    arr[2] = 3
    arr[3] = 4
    arr[4] = 5

    fmt.Println("数组:", arr)
}

切片

goCopy code
package main

import "fmt"

func main() {
    slice := []int{1, 2, 3, 4, 5}

    fmt.Println("切片:", slice)
}

切片是动态数组,与数组相比,切片的长度可以动态增长。Go语言提供了强大的切片操作函数,如append()用于向切片添加元素,len()用于获取切片长度等。

5. 函数

函数是Go语言中的重要组成部分,它可以接受参数并返回结果。

goCopy code
package main

import "fmt"

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

func main() {
    result := add(3, 5)
    fmt.Println("3 + 5 =", result)
}

6. 结构体与方法

在Go语言中,结构体是一种自定义数据类型,它可以封装不同类型的字段。

goCopy code
package main

import "fmt"

type Person struct {
    name string
    age  int
}

func (p Person) introduce() {
    fmt.Printf("我叫%s,今年%d岁。\n", p.name, p.age)
}

func main() {
    p1 := Person{"Alice", 25}
    p1.introduce()
}

在上面的例子中,我们定义了一个名为Person的结构体,它包含了nameage两个字段。我们还定义了一个introduce()方法,用于展示Person结构体的信息。

7. 并发编程

Go语言在语言级别支持并发编程,这使得编写高效并发程序变得简单。

goCopy code
package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func printNumbers() {
    for i := 1; i <= 5; i++ {
        fmt.Printf("%d ", i)
    }
    wg.Done()
}

func printLetters() {
    defer wg.Done()
    for char := 'a'; char < 'e'; char++ {
        fmt.Printf("%c ", char)
    }
}

func main() {
    wg.Add(2)
    go printNumbers()
    go printLetters()
    wg.Wait()
}

在上面的例子中,我们使用sync.WaitGroup来等待两个并发函数的完成。通过go关键字,我们可以在Go语言中轻松地创建并启动并发的goroutine。

8. 错误处理

Go语言鼓励显式处理错误,这有助于提高程序的健壮性。

goCopy code
package main

import (
    "fmt"
    "errors"
)

func divide(x, y float64) (float64, error) {
    if y == 0 {
        return 0, errors.New("除数不能为零")
    }
    return x / y, nil
}

func main() {
    result, err := divide(10, 2)
    if err != nil {
        fmt.Println("错误:", err)
    } else {
        fmt.Println("结果:", result)
    }
}

在上面的例子中,我们定义了一个divide()函数来进行除法运算,并显式返回一个错误,表示除数不能为零。在调用该函数时,我们使用err变量来接收错误信息,并进行相应的处理。

9. 标准库的应用

Go语言的标准库提供了丰富的功能,包括网络编程、文件操作、时间处理等。

goCopy code
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    response, err := http.Get("https://api.example.com/data")
    if err != nil {
        fmt.Println("请求错误:", err)
        return
    }
    defer response.Body.Close()

    data, err := ioutil.ReadAll(response.Body)
    if err != nil {
        fmt.Println("读取响应数据错误:", err)
        return
    }

    fmt.Println("响应数据:", string(data))
}

在上面的例子中,我们使用标准库中的net/http包来发送HTTP请求并获取响应数据。ioutil包用于简化读取响应体的操作。

结论

在本文中,深入了解了Go语言的一些核心概念和特性,包括结构体、并发编程、错误处理和标准库的应用。Go语言的简洁性、高效性和并发安全性使其成为现代编程领域的瑰宝。通过不断学习和实践,相信我们会在Go语言的世界里不断进步,创造出更优秀的应用程序。