释放Go的力量

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的简洁和优雅,为后端开发的无尽可能性打开大门。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 一、GO简介 Go语言[https://go.dev/solutions](也叫 Golang)是Google开发...
    宏势阅读 5,654评论 0 3
  • 一、熟悉Go语言运行环境、包管理工具(手动装一下Go环境并从零运行一个依赖第三方库的Go程序) go module...
    橙小花一直相信阅读 305评论 0 0
  • 原教程地址:微软Go入门[https://docs.microsoft.com/zh-cn/learn/paths...
    KyoDante阅读 1,248评论 0 2
  • 开发环境 GOROOT: go的安装目录, go原生的工具在该目录下GOPATH: 通常存放自己开发的代码或第三方...
    Never_Yg阅读 210评论 0 0
  • go1.13 1.对数字字面量进行了改动 在1.13版本之前的golang仅支持十进制和十六进制的字面量,而其他语...
    陈氏美阅读 1,156评论 0 1