谈技术读书手绘

释放Go的力量

2023-08-31  本文已影响0人  技术的游戏

GoLang基础的全面教程

简介:Google的游戏规则改变者——GoLang的兴起

当Google向世界介绍GoLang(简称Go)时,它彻底改变了开发者对后端开发的看法。凭借对简单性、效率和并发性的关注,Go迅速赢得了人心,并成为了开发者构建稳健和可扩展应用程序的最爱。

在这个教程中,我们将深入探讨GoLang的基础知识,探索其核心数据结构、主循环、切片和映射等关键概念,以及卓越的Goroutine模块。

理解Go的基础

GoLang诞生的原因是为了克服现有语言的限制和复杂性,同时保持高性能和易用性。Go由Google的Robert Griesemer、Rob Pike和Ken Thompson开发,于2009年正式发布,并自此赢得了一个忠诚并不断增长的社区。

在这一章中,我们将开始理解GoLang的基础知识,包括变量、常量和基础数据类型。

package main
import "fmt"
func main() {
    // Variables and Constants
    var name string = "John Doe"
    age := 30    
    const pi = 3.14159    
    fmt.Printf("Name: %s, Age: %d\n", name, age)
    fmt.Printf("Value of pi: %f\n", pi)
}

探索数据结构

在深入研究该语言的并发特性之前,让我们先了解Go中的基础数据结构。

a. 数组:

Go中的数组是固定大小的、具有相同数据类型的元素序列。

package main
import "fmt"
func main() {
    // Arrays
    var numbers [5]int
    numbers = [5]int{1, 2, 3, 4, 5}    
    fmt.Println("Array:", numbers)
}

b. 切片:

切片是动态的、灵活的数组,允许高效的数据操作。

package main
import "fmt"
func main() {
    // Slices
    numbers := []int{1, 2, 3, 4, 5}
        numbers = append(numbers, 6)
    fmt.Println("Slice:", numbers)
}

c. 映射:

映射在Go中是键值数据结构,允许使用唯一键轻松访问值。

package main
import "fmt"
func main() {
    // Maps
    person := map[string]int{
        "John": 30,
        "Jane": 25,
    }    
    fmt.Println("Age of John:", person["John"])
}

主循环

与大多数编程语言一样,Go为重复任务提供循环。我们将介绍两种主要的循环结构:“for”和“range”,并演示如何为各种目的利用它们。

a. For循环:

“for”循环用于迭代一系列元素。

package main
import "fmt"func main() {
    // For loop
    for i := 1; i <= 5; i++ {
        fmt.Println("Iteration:", i)
    }
}

b. 范围循环:

“范围”循环迭代数组、切片、字符串或映射的元素。

package main
import "fmt"
func main() {
    // Range loop
    numbers := []int{1, 2, 3, 4, 5}
    for index, value := range numbers {
        fmt.Printf("Index: %d, Value: %d\n", index, value)
    }
}

Go并发:通道和协程

Go的突破性特性是其内置的并发支持,使开发者能够创建高效、并发的程序,而不需要传统线程的复杂性。促成这一点的两个关键组件是Channels(通道)和Goroutines(协程)。

a. 通道:

通道是通信管道,允许Goroutines之间安全地交换数据。

package main
import "fmt"
func sum(values []int, resultChan chan int) {
    sum := 0
    for _, value := range values {
        sum += value
    }
    resultChan <- sum
}
func main() {
    values := []int{1, 2, 3, 4, 5}    
    resultChan := make(chan int)
    go sum(values, resultChan)    
    total := <-resultChan
    fmt.Println("Total sum:", total)
}

b. 协程:

Goroutines是轻量级的、并发的函数,能够有效地处理多个任务。

package main
import "fmt"
func printNumbers() {
    for i := 1; i <= 5; i++ {
        fmt.Println("Number:", i)
    }
}
func main() {
    go printNumbers()
    fmt.Println("This will be executed concurrently with printNumbers()")
}

c. 使用WaitGroups同步:

WaitGroups有助于同步Goroutines并管理它们的完成。

package main
import (
    "fmt"
    "sync"
)
func printNumbers(waitGroup *sync.WaitGroup) {
    defer waitGroup.Done()    
    for i := 1; i <= 5; i++ {
        fmt.Println("Number:", i)
    }
}
func main() {
    var waitGroup sync.WaitGroup
    waitGroup.Add(1)    
    go printNumbers(&waitGroup)    
    waitGroup.Wait()
    fmt.Println("All Goroutines are done!")
}

go.mod和go.sum文件

Go引入了go.mod和go.sum文件来管理依赖关系并确保项目的可重复性。让我们了解它们的目的及如何有效地使用它们。

go.mod:

go.mod文件定义了模块的路径及其依赖关系,包括版本控制。

go.mod文件示例:

module example.com/golang-tutorial

go 1.17
require (
    github.com/gorilla/mux v1.8.0
    golang.org/x/net v0.0.0-20230110201757-142b31761383
    ...
)

go.sum:

go.sum文件通过记录模块的加密校验和来确保依赖关系的安全性。

go.sum文件示例:

github.com/gorilla/mux v1.8.0 h1:abcde1234567890abcdefghijk...
github.com/gorilla/mux v1.8.0/go.mod h1:xyz0987654321zyxwvutsrqponml...
golang.org/x/net v0.0.0-20230110201757-142b31761383 h1:mnopqrstuvwxyzabcd...
golang.org/x/net v0.0.0-20230110201757-142b31761383/go.mod h1:wxyzabcdefghijklmnop...
...

结论:

GoLang,诞生于Google的创新,已经改变了后端开发的格局。凭借其强大的数据结构、高效的循环和出色的并发支持,Go使开发人员能够构建高性能的应用程序。通过了解切片、映射、通道和Goroutines等基本概念,您可以充分发挥GoLang的潜力,并将您的后端项目提升到新的高度。此外,利用go.mod和go.sum文件确保了通过适当的依赖管理来实现项目的稳定性和安全性。

总之,拥抱GoLang的简洁和优雅,为后端开发的无尽可能性打开大门。

上一篇下一篇

猜你喜欢

热点阅读