最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語(yǔ)言語(yǔ)法基礎(chǔ)的全面梳理(適合入門(mén))

 更新時(shí)間:2026年06月03日 09:55:02   作者:我不是8神  
這篇文章主要介紹了go語(yǔ)言語(yǔ)法基礎(chǔ)的相關(guān)資料,從基礎(chǔ)語(yǔ)法到并發(fā)編程,涵蓋變量聲明、數(shù)據(jù)類型、流程控制、函數(shù)、接口、錯(cuò)誤處理及并發(fā)編程,全面覆蓋Go語(yǔ)言核心特性,需要的朋友可以參考下

前言

Go(又稱 Golang)是一門(mén)靜態(tài)類型、編譯型語(yǔ)言,主打簡(jiǎn)潔、高效、并發(fā)安全,語(yǔ)法設(shè)計(jì)貼近工程實(shí)踐,避免冗余特性。以下是其核心語(yǔ)法的全面梳理,適合入門(mén)者系統(tǒng)學(xué)習(xí),也可作為日常參考。

一、基礎(chǔ)語(yǔ)法:程序結(jié)構(gòu)與變量常量

1. 程序入口與包聲明

Go 程序的執(zhí)行入口是 main 包下的 main() 函數(shù),必須滿足以下規(guī)則:

  • 每個(gè)文件屬于一個(gè)包(package 包名 聲明在文件第一行);
  • 只有 main 包能包含 main() 函數(shù)(程序入口);
  • 導(dǎo)入依賴包使用 import,支持單行 / 多行導(dǎo)入。
// 單行導(dǎo)入
import "fmt"
// 多行導(dǎo)入(推薦,更清晰)
import (
    "fmt"
    "math"
)
// 程序入口:無(wú)參數(shù)、無(wú)返回值
func main() {
    fmt.Println("Hello, Go!") // 輸出:Hello, Go!
}

2. 變量聲明

Go 變量聲明有 4 種方式,核心原則:強(qiáng)類型、聲明即初始化(默認(rèn)零值)

聲明方式語(yǔ)法示例適用場(chǎng)景
完整聲明var 變量名 類型 = 值類型明確,需顯式指定
類型推導(dǎo)(推薦)var 變量名 = 值編譯器自動(dòng)推導(dǎo)類型,簡(jiǎn)潔
短變量聲明(僅函數(shù)內(nèi))變量名 := 值函數(shù)內(nèi)快速聲明,最常用
批量聲明var (a int = 1; b string = "test")多變量集中聲明,減少重復(fù)代碼

零值規(guī)則:未顯式賦值的變量會(huì)被賦予默認(rèn)零值(int=0、string=""、bool=false、指針 = nil 等)。

func main() {
    var a int = 10          // 完整聲明
    var b = "hello"         // 類型推導(dǎo)(string 類型)
    c := 3.14               // 短變量聲明(float64 類型)
    var (
        d bool              // 零值:false
        e []int             // 零值:nil(切片)
    )
    fmt.Println(a, b, c, d, e) // 輸出:10 hello 3.14 false []
}

3. 常量聲明

使用 const 關(guān)鍵字,值必須是編譯期可確定的常量(數(shù)字、字符串、布爾值),支持批量聲明和枚舉。

// 基本常量
const PI = 3.14159
const NAME string = "Go"

// 批量聲明
const (
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3
)

// iota 枚舉(自增常量,默認(rèn)從 0 開(kāi)始,每行+1)
const (
    A = iota // 0
    B = iota // 1
    C = 100  // 手動(dòng)賦值,打破自增
    D = iota // 3(恢復(fù)自增,繼續(xù)計(jì)數(shù))
)

二、數(shù)據(jù)類型:值類型與引用類型

Go 數(shù)據(jù)類型分為 值類型(拷貝傳遞)和 引用類型(指針傳遞),核心類型如下:

1. 基本類型(值類型)

類型類別具體類型說(shuō)明
整數(shù)類型int8/int16/int32/int64、uint8/uint16...int 隨系統(tǒng)位數(shù)(32/64 位),uint 同理
浮點(diǎn)類型float32(精度約 6 位)、float64(默認(rèn))float64 精度更高,推薦優(yōu)先使用
布爾類型bool取值 true/false,不可用 0/1 替代
字符串類型string不可變(修改需重新生成),UTF-8 編碼
字符類型rune(別名 int32,表示 Unicode 字符)區(qū)別于 byte(uint8,ASCII 字符)
func main() {
    var age int = 25
    var weight float64 = 68.5
    var isStudent bool = true
    var name string = "張三"
    var char rune = '中' // 注意:?jiǎn)我?hào)表示字符,雙引號(hào)表示字符串
    
    fmt.Printf("%T %T %T %T %T\n", age, weight, isStudent, name, char)
    // 輸出:int float64 bool string int32
}

2. 復(fù)合類型

(1)數(shù)組(值類型)

固定長(zhǎng)度、同類型元素的集合,長(zhǎng)度是類型的一部分([3]int 和 [5]int 是不同類型)。

// 聲明方式
var arr1 [3]int = [3]int{1, 2, 3} // 完整聲明
arr2 := [3]int{4, 5, 6}           // 類型推導(dǎo)
arr3 := [...]int{7, 8, 9}         // 自動(dòng)推導(dǎo)長(zhǎng)度

// 訪問(wèn)與修改
fmt.Println(arr1[0]) // 輸出:1
arr2[1] = 10
fmt.Println(arr2) // 輸出:[4 10 6]

(2)切片(引用類型)

動(dòng)態(tài)長(zhǎng)度的 “動(dòng)態(tài)數(shù)組”,基于數(shù)組實(shí)現(xiàn),核心結(jié)構(gòu):指針+長(zhǎng)度+容量,聲明時(shí)無(wú)需指定長(zhǎng)度。

// 聲明方式
var s1 []int               // 零值:nil
s2 := []int{1, 2, 3}       // 直接初始化
s3 := make([]int, 3, 5)    // make(類型, 長(zhǎng)度, 容量):長(zhǎng)度 3,容量 5

// 常用操作
s4 := append(s2, 4, 5)     // 追加元素(容量不足時(shí)自動(dòng)擴(kuò)容)
s5 := s2[1:3]              // 切片截取:[start:end),左閉右開(kāi)
fmt.Println(len(s3), cap(s3)) // 輸出:3 5(len=長(zhǎng)度,cap=容量)

(3)映射(map,引用類型)

無(wú)序鍵值對(duì)集合,鍵必須是 “可比較類型”(int、string、bool 等,不能是切片、map)。

// 聲明與初始化(必須用 make 或直接賦值,否則為 nil,無(wú)法添加元素)
m1 := make(map[string]int)       // 空 map
m2 := map[string]string{
    "name": "李四",
    "age":  "28",
}

// 增刪改查
m1["score"] = 90                // 新增/修改
fmt.Println(m1["score"])        // 查詢:90
delete(m1, "score")             // 刪除
v, ok := m1["score"]            // 安全查詢(避免鍵不存在時(shí)返回零值)
fmt.Println(v, ok)              // 輸出:0 false(ok 表示鍵是否存在)

(4)結(jié)構(gòu)體(值類型)

自定義復(fù)合類型,用于封裝多個(gè)不同類型的字段。

// 定義結(jié)構(gòu)體
type Person struct {
    Name string
    Age  int
    Sex  string
}

// 初始化
p1 := Person{Name: "王五", Age: 30, Sex: "男"} // 指定字段名(推薦)
p2 := Person{"趙六", 26, "女"}                // 按字段順序(不推薦,易出錯(cuò))

// 訪問(wèn)字段
fmt.Println(p1.Name) // 輸出:王五
p2.Age = 27

(5)指針(引用類型)

存儲(chǔ)變量?jī)?nèi)存地址的變量,核心用途:修改函數(shù)參數(shù)的值(值類型默認(rèn)拷貝傳遞)。

func main() {
    a := 10
    var p *int = &a // &a:取變量 a 的地址;p 是 *int 類型指針
    fmt.Println(*p) // *p:通過(guò)指針訪問(wèn)變量的值,輸出:10
    
    modify(p)       // 傳遞指針
    fmt.Println(a)  // 輸出:20(變量被修改)
}

// 函數(shù)接收指針參數(shù)
func modify(x *int) {
    *x = 20 // 修改指針指向的變量值
}

三、流程控制:條件、循環(huán)、跳轉(zhuǎn)

1. 條件語(yǔ)句(if-else)

  • 無(wú)需括號(hào)包裹條件表達(dá)式;
  • 條件表達(dá)式必須是 bool 類型(不能用 0/1 替代);
  • 支持 “初始化語(yǔ)句”(在條件前聲明變量,作用域僅限 if 塊)。
func main() {
    age := 18
    // 基礎(chǔ)用法
    if age >= 18 {
        fmt.Println("成年")
    } else {
        fmt.Println("未成年")
    }
    
    // 帶初始化語(yǔ)句
    if score := 95; score >= 90 {
        fmt.Println("優(yōu)秀")
    } else if score >= 80 {
        fmt.Println("良好")
    } else {
        fmt.Println("合格")
    }
}

2. 循環(huán)語(yǔ)句(for)

Go 只有 for 一種循環(huán)結(jié)構(gòu),支持三種用法:

(1)普通循環(huán)(類似 while)

i := 0
for i < 5 { // 條件滿足時(shí)循環(huán)
    fmt.Println(i)
    i++
}

(2)經(jīng)典 for 循環(huán)(初始化 + 條件 + 自增)

for j := 0; j < 3; j++ {
    fmt.Println(j) // 輸出:0 1 2
}

(3)無(wú)限循環(huán)(無(wú)條件)

count := 0
for { // 等價(jià)于 for ; ; {}
    count++
    if count == 3 {
        break // 跳出循環(huán)
    }
    fmt.Println(count) // 輸出:1 2
}

(4)循環(huán)遍歷(for range)

專門(mén)用于遍歷數(shù)組、切片、map、字符串等,更簡(jiǎn)潔高效:

// 遍歷切片
s := []int{1, 2, 3}
for index, value := range s {
    fmt.Printf("索引:%d,值:%d\n", index, value)
}

// 遍歷 map(無(wú)序)
m := map[string]int{"a":1, "b":2}
for key, val := range m {
    fmt.Printf("鍵:%s,值:%d\n", key, val)
}

// 遍歷字符串(按 rune 遍歷,支持中文)
str := "Hello 世界"
for i, c := range str {
    fmt.Printf("索引:%d,字符:%c\n", i, c)
}

3. 跳轉(zhuǎn)語(yǔ)句(break、continue、goto)

  • break:跳出當(dāng)前循環(huán) /switch 塊;
  • continue:跳過(guò)當(dāng)前循環(huán)迭代,進(jìn)入下一次;
  • goto:跳轉(zhuǎn)到當(dāng)前函數(shù)內(nèi)的標(biāo)簽(謹(jǐn)慎使用,避免破壞代碼結(jié)構(gòu))。
// break 示例(跳出循環(huán))
for i := 0; i < 5; i++ {
    if i == 3 {
        break
    }
    fmt.Println(i) // 輸出:0 1 2
}

// goto 示例
func main() {
    fmt.Println("1")
    goto label
    fmt.Println("2") // 不會(huì)執(zhí)行
label:
    fmt.Println("3") // 輸出:1 3
}

4. 選擇語(yǔ)句(switch)

Go 的 switch 更靈活,支持任意類型,無(wú)需 break(默認(rèn)自動(dòng)跳出,需穿透用 fallthrough)。

func main() {
    num := 2
    switch num {
    case 1:
        fmt.Println("一")
    case 2:
        fmt.Println("二")
    case 3:
        fmt.Println("三")
    default:
        fmt.Println("其他")
    }

    // 帶初始化語(yǔ)句
    switch score := 85; { // 條件可以是表達(dá)式(類似 if-else 鏈)
    case score >= 90:
        fmt.Println("優(yōu)秀")
    case score >= 80:
        fmt.Println("良好")
    default:
        fmt.Println("合格")
    }
}

四、函數(shù):聲明、參數(shù)、返回值

1. 函數(shù)聲明

核心語(yǔ)法:func 函數(shù)名(參數(shù)列表) (返回值列表) { 函數(shù)體 }

// 無(wú)參數(shù)、無(wú)返回值
func sayHello() {
    fmt.Println("Hello, Go Function!")
}

// 有參數(shù)、有返回值(單返回值)
func add(a int, b int) int { // 參數(shù)類型相同可簡(jiǎn)寫(xiě)為 (a, b int)
    return a + b
}

// 多返回值(Go 特色,常用于返回結(jié)果+錯(cuò)誤)
func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, fmt.Errorf("除數(shù)不能為 0") // 返回錯(cuò)誤
    }
    return a / b, nil // 無(wú)錯(cuò)誤返回 nil
}

// 調(diào)用函數(shù)
func main() {
    sayHello()
    sum := add(10, 20)
    fmt.Println(sum) // 輸出:30
    
    res, err := divide(10, 2)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(res) // 輸出:5
    }
}

2. 函數(shù)進(jìn)階特性

(1)命名返回值

返回值聲明時(shí)指定名稱,函數(shù)內(nèi)可直接賦值,return 無(wú)需帶參數(shù)(更簡(jiǎn)潔)。

func calc(a, b int) (sum, sub int) {
    sum = a + b
    sub = a - b
    return // 裸返回,自動(dòng)返回 sum 和 sub
}

(2)可變參數(shù)

參數(shù)列表最后一個(gè)參數(shù)用 ...類型 表示,函數(shù)內(nèi)視為切片處理。

func sum(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

// 調(diào)用:可傳遞任意個(gè) int 類型參數(shù)
fmt.Println(sum(1, 2, 3))       // 輸出:6
fmt.Println(sum(4, 5, 6, 7))    // 輸出:22

(3)函數(shù)作為參數(shù) / 返回值(高階函數(shù))

Go 中函數(shù)是 “一等公民”,可作為參數(shù)傳遞或作為返回值返回。

// 函數(shù)作為參數(shù)
func operate(a, b int, f func(int, int) int) int {
    return f(a, b)
}

// 函數(shù)作為返回值
func getAddFunc() func(int, int) int {
    return func(a, b int) int {
        return a + b
    }
}

// 調(diào)用
addFunc := getAddFunc()
fmt.Println(operate(5, 3, addFunc)) // 輸出:8

五、接口與面向?qū)ο?/h2>

Go 沒(méi)有類和繼承,通過(guò) 接口(interface) 實(shí)現(xiàn)多態(tài),核心思想:鴨子類型(“看起來(lái)像鴨子,走起來(lái)像鴨子,就是鴨子”)。

1. 接口聲明

接口是方法簽名的集合,只定義 “做什么”,不定義 “怎么做”(無(wú)實(shí)現(xiàn))。

// 定義接口
type Animal interface {
    Speak() string // 方法簽名:無(wú)參數(shù),返回 string
    Move() string
}

2. 接口實(shí)現(xiàn)

無(wú)需顯式聲明 “實(shí)現(xiàn)接口”,只要結(jié)構(gòu)體實(shí)現(xiàn)了接口的所有方法,就自動(dòng)實(shí)現(xiàn)該接口(非侵入式)。

// 定義結(jié)構(gòu)體
type Dog struct {
    Name string
}

type Cat struct {
    Name string
}

// Dog 實(shí)現(xiàn) Animal 接口(實(shí)現(xiàn)所有方法)
func (d Dog) Speak() string {
    return fmt.Sprintf("%s 汪汪叫", d.Name)
}
func (d Dog) Move() string {
    return fmt.Sprintf("%s 跑起來(lái)", d.Name)
}

// Cat 實(shí)現(xiàn) Animal 接口
func (c Cat) Speak() string {
    return fmt.Sprintf("%s 喵喵叫", c.Name)
}
func (c Cat) Move() string {
    return fmt.Sprintf("%s 跳起來(lái)", c.Name)
}

3. 接口使用(多態(tài))

接口變量可存儲(chǔ)任意實(shí)現(xiàn)該接口的結(jié)構(gòu)體實(shí)例,調(diào)用方法時(shí)自動(dòng)執(zhí)行對(duì)應(yīng)實(shí)現(xiàn)。

func main() {
    var animal Animal // 接口變量
    animal = Dog{Name: "旺財(cái)"}
    fmt.Println(animal.Speak()) // 輸出:旺財(cái) 汪汪叫
    fmt.Println(animal.Move())  // 輸出:旺財(cái) 跑起來(lái)
    
    animal = Cat{Name: "咪寶"}
    fmt.Println(animal.Speak()) // 輸出:咪寶 喵喵叫
}

4. 空接口(interface {})

無(wú)任何方法的接口,可存儲(chǔ)任意類型的值(類似 Java 的 Object),常用于處理未知類型。

// 空接口變量
var any interface{}
any = 10          // 存儲(chǔ) int
any = "hello"     // 存儲(chǔ) string
any = Dog{Name: "旺財(cái)"} // 存儲(chǔ)結(jié)構(gòu)體

// 類型斷言(判斷空接口存儲(chǔ)的實(shí)際類型)
val, ok := any.(Dog)
if ok {
    fmt.Println(val.Name) // 輸出:旺財(cái)
}

六、錯(cuò)誤處理

Go 不使用 try-catch 捕獲異常,而是通過(guò) 顯式返回錯(cuò)誤(error 類型) 處理錯(cuò)誤,核心原則:“錯(cuò)誤也是值”。

1. 錯(cuò)誤類型與創(chuàng)建

error 是接口類型,定義:type error interface { Error() string },常用 fmt.Errorf() 或 errors.New() 創(chuàng)建錯(cuò)誤。

import (
    "errors"
    "fmt"
)

func checkAge(age int) error {
    if age < 0 || age > 120 {
        // 創(chuàng)建錯(cuò)誤:兩種方式
        return errors.New("年齡必須在 0-120 之間")
        // return fmt.Errorf("年齡 %d 非法:必須在 0-120 之間", age) // 帶格式化信息
    }
    return nil // 無(wú)錯(cuò)誤返回 nil
}

// 調(diào)用:必須檢查錯(cuò)誤
func main() {
    err := checkAge(150)
    if err != nil {
        fmt.Println("錯(cuò)誤:", err) // 輸出:錯(cuò)誤:年齡必須在 0-120 之間
        return
    }
    fmt.Println("年齡合法")
}

2. 自定義錯(cuò)誤(進(jìn)階)

通過(guò)結(jié)構(gòu)體實(shí)現(xiàn) error 接口,可攜帶更多錯(cuò)誤信息(如錯(cuò)誤碼)。

// 自定義錯(cuò)誤結(jié)構(gòu)體
type MyError struct {
    Code    int
    Message string
}

// 實(shí)現(xiàn) error 接口的 Error() 方法
func (e *MyError) Error() string {
    return fmt.Sprintf("錯(cuò)誤碼:%d,信息:%s", e.Code, e.Message)
}

// 返回自定義錯(cuò)誤
func doSomething() error {
    return &MyError{Code: 500, Message: "服務(wù)器內(nèi)部錯(cuò)誤"}
}

// 調(diào)用
err := doSomething()
if err != nil {
    fmt.Println(err) // 輸出:錯(cuò)誤碼:500,信息:服務(wù)器內(nèi)部錯(cuò)誤
    // 類型斷言獲取自定義錯(cuò)誤信息
    if myErr, ok := err.(*MyError); ok {
        fmt.Println("錯(cuò)誤碼:", myErr.Code) // 輸出:500
    }
}

七、并發(fā)編程(Go 核心特性)

Go 原生支持并發(fā),通過(guò) goroutine(輕量級(jí)線程) 和 channel(通道) 實(shí)現(xiàn) “通信順序進(jìn)程(CSP)” 模型,簡(jiǎn)單高效。

1. Goroutine(協(xié)程)

  • 輕量級(jí)線程,由 Go 運(yùn)行時(shí)(runtime)管理,而非操作系統(tǒng)內(nèi)核;
  • 啟動(dòng)成本極低(棧初始 2KB,可動(dòng)態(tài)擴(kuò)容),支持百萬(wàn)級(jí)并發(fā);
  • 用 go 關(guān)鍵字啟動(dòng)(后跟函數(shù) / 方法調(diào)用)。
func sayHello(name string) {
    fmt.Printf("Hello, %s\n", name)
}

func main() {
    // 啟動(dòng) 3 個(gè) goroutine
    go sayHello("A")
    go sayHello("B")
    go sayHello("C")
    
    // 主 goroutine 退出后,子 goroutine 會(huì)被強(qiáng)制終止,需等待
    time.Sleep(100 * time.Millisecond) // 簡(jiǎn)單等待(不推薦)
}

2. Channel(通道)

用于 goroutine 間通信,解決數(shù)據(jù)競(jìng)爭(zhēng),實(shí)現(xiàn) “同步 + 傳值”,分為無(wú)緩沖通道有緩沖通道

(1)無(wú)緩沖通道(同步通道)

  • 發(fā)送操作(ch <- val)會(huì)阻塞,直到有 goroutine 接收;
  • 接收操作(val := <-ch)會(huì)阻塞,直到有 goroutine 發(fā)送。
func send(ch chan int) {
    ch &lt;- 10 // 發(fā)送 10 到通道,阻塞直到接收
    fmt.Println("發(fā)送完成")
}

func main() {
    ch := make(chan int) // 無(wú)緩沖通道(容量默認(rèn) 0)
    
    go send(ch)          // 啟動(dòng)發(fā)送 goroutine
    
    val := &lt;-ch          // 接收通道數(shù)據(jù),阻塞直到發(fā)送
    fmt.Println("接收值:", val) // 輸出:接收值:10
    
    time.Sleep(100 * time.Millisecond) // 輸出:發(fā)送完成
}

(2)有緩沖通道(異步通道)

  • 容量 > 0,發(fā)送操作僅當(dāng)緩沖區(qū)滿時(shí)阻塞;
  • 接收操作僅當(dāng)緩沖區(qū)空時(shí)阻塞。 
func main() {
    ch := make(chan int, 2) // 有緩沖通道,容量 2
    
    ch &lt;- 1 // 發(fā)送成功(緩沖區(qū)未滿)
    ch &lt;- 2 // 發(fā)送成功(緩沖區(qū)未滿)
    // ch &lt;- 3 // 阻塞(緩沖區(qū)滿)
    
    fmt.Println(&lt;-ch) // 接收 1,緩沖區(qū)剩余 1
    fmt.Println(&lt;-ch) // 接收 2,緩沖區(qū)空
}

(3)通道關(guān)閉與遍歷

  • 用 close(ch) 關(guān)閉通道,關(guān)閉后不能再發(fā)送數(shù)據(jù),但可繼續(xù)接收;
  • 用 for range 遍歷通道,直到通道關(guān)閉。
func send(ch chan int) {
    for i := 0; i &lt; 3; i++ {
        ch &lt;- i
    }
    close(ch) // 發(fā)送完成后關(guān)閉通道
}

func main() {
    ch := make(chan int, 3)
    go send(ch)
    
    // 遍歷通道,直到關(guān)閉
    for val := range ch {
        fmt.Println(val) // 輸出:0 1 2
    }
}

3. sync 包(同步原語(yǔ))

除了 channel,還可通過(guò) sync 包的工具實(shí)現(xiàn)同步(如互斥鎖、等待組)。

(1)等待組(sync.WaitGroup)

替代 time.Sleep,優(yōu)雅等待多個(gè) goroutine 完成。

func work(id int, wg *sync.WaitGroup) {
    defer wg.Done() // goroutine 完成后調(diào)用(計(jì)數(shù)器-1)
    fmt.Printf("工作 %d 開(kāi)始\n", id)
    time.Sleep(100 * time.Millisecond)
    fmt.Printf("工作 %d 結(jié)束\n", id)
}

func main() {
    var wg sync.WaitGroup
    
    for i := 1; i &lt;= 3; i++ {
        wg.Add(1) // 啟動(dòng) goroutine 前計(jì)數(shù)器+1
        go work(i, &amp;wg) // 傳遞指針(避免拷貝)
    }
    
    wg.Wait() // 阻塞,直到計(jì)數(shù)器為 0
    fmt.Println("所有工作完成")
}

(2)互斥鎖(sync.Mutex)

解決多個(gè) goroutine 并發(fā)修改共享變量的數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題。

var (
    count int
    mutex sync.Mutex // 互斥鎖
)

func increment() {
    mutex.Lock()         // 加鎖
    defer mutex.Unlock() // 延遲解鎖(確保函數(shù)退出時(shí)釋放)
    count++
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i &lt; 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            increment()
        }()
    }
    wg.Wait()
    fmt.Println("count:", count) // 輸出:1000(無(wú)數(shù)據(jù)競(jìng)爭(zhēng))
}

八、常用標(biāo)準(zhǔn)庫(kù)

Go 標(biāo)準(zhǔn)庫(kù)豐富,以下是入門(mén)必備的核心庫(kù):

庫(kù)名核心功能常用函數(shù) / 類型
fmt輸入輸出格式化Println()、Printf()、Scanln()
os操作系統(tǒng)交互(文件、環(huán)境變量等)os.Args、os.Open()、os.Exit()
io/ioutil文件讀寫(xiě)(簡(jiǎn)化版)ioutil.ReadFile()ioutil.WriteFile()
bufio帶緩沖的讀寫(xiě)(高效)bufio.NewReader()、bufio.Scanner
net/httpHTTP 客戶端 / 服務(wù)端http.Get()、http.HandleFunc()
encoding/jsonJSON 序列化 / 反序列化json.Marshal()json.Unmarshal()
time時(shí)間處理time.Now()、time.Sleep()time.Parse()

九、語(yǔ)法核心注意事項(xiàng)

  • 大小寫(xiě)敏感Name 和 name 是不同變量 / 函數(shù);
  • 語(yǔ)句結(jié)尾無(wú)分號(hào):編譯器自動(dòng)添加,一行一個(gè)語(yǔ)句(多行語(yǔ)句需用分號(hào)分隔);
  • 變量 / 導(dǎo)入未使用:編譯報(bào)錯(cuò)(避免冗余代碼);
  • 值類型 vs 引用類型:值類型拷貝傳遞,引用類型傳遞指針(修改會(huì)影響原數(shù)據(jù));
  • map 和切片必須初始化:nil map / 切片無(wú)法添加元素,需用 make 或直接賦值;
  • 并發(fā)安全:多個(gè) goroutine 操作共享變量時(shí),需用 mutex 或 channel 同步。

總結(jié) 

到此這篇關(guān)于go語(yǔ)言語(yǔ)法基礎(chǔ)的文章就介紹到這了,更多相關(guān)go語(yǔ)言語(yǔ)法基礎(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Golang互斥鎖內(nèi)部實(shí)現(xiàn)

    詳解Golang互斥鎖內(nèi)部實(shí)現(xiàn)

    本篇文章主要介紹了詳解Golang互斥鎖內(nèi)部實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • golang panic 函數(shù)用法示例詳解

    golang panic 函數(shù)用法示例詳解

    在Go語(yǔ)言中,panic用于觸發(fā)不可恢復(fù)的錯(cuò)誤,終止函數(shù)執(zhí)行并逐層向上觸發(fā)defer,最終若未被recover捕獲,程序會(huì)崩潰,recover用于在defer函數(shù)中捕獲panic,恢復(fù)程序流程,建議優(yōu)先返回error,僅在嚴(yán)重錯(cuò)誤或不可恢復(fù)場(chǎng)景下使用panic,并在關(guān)鍵位置recover,感興趣的朋友一起看看吧
    2025-03-03
  • go語(yǔ)言執(zhí)行windows下命令行的方法

    go語(yǔ)言執(zhí)行windows下命令行的方法

    這篇文章主要介紹了go語(yǔ)言執(zhí)行windows下命令行的方法,實(shí)例分析了Go語(yǔ)言操作windows下命令行的技巧,需要的朋友可以參考下
    2015-03-03
  • golang-gin-mgo高并發(fā)服務(wù)器搭建教程

    golang-gin-mgo高并發(fā)服務(wù)器搭建教程

    這篇文章主要介紹了golang-gin-mgo高并發(fā)服務(wù)器搭建教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Golang中的godoc使用簡(jiǎn)介(推薦)

    Golang中的godoc使用簡(jiǎn)介(推薦)

    Godoc是go語(yǔ)言的文檔化工具,類似于文檔化工具godoc,類似于Python的Docstring和Java的Javadoc,這篇文章主要介紹了Golang中的godoc使用簡(jiǎn)介,需要的朋友可以參考下
    2022-10-10
  • Golang中多個(gè)if代碼優(yōu)化小技巧

    Golang中多個(gè)if代碼優(yōu)化小技巧

    這篇文章主要為大家詳細(xì)介紹了Golang中一些常用的if代碼優(yōu)化小技巧,w文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • golang封裝一個(gè)執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼

    golang封裝一個(gè)執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼

    在?Go?語(yǔ)言中,您可以使用?os/exec?包來(lái)執(zhí)行外部命令,不通過(guò)調(diào)用?shell,并且能夠獲得進(jìn)程的退出碼、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出,下面給大家分享golang封裝一個(gè)執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)的方法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • 解決Golang在Web開(kāi)發(fā)時(shí)前端莫名出現(xiàn)的空白換行

    解決Golang在Web開(kāi)發(fā)時(shí)前端莫名出現(xiàn)的空白換行

    最近在使用Go語(yǔ)言開(kāi)發(fā)Web時(shí),在前端莫名出現(xiàn)了空白換行,找了網(wǎng)上的一些資料終于找到了解決方法,現(xiàn)在分享給大家,有需要的可以參考。
    2016-08-08
  • GO語(yǔ)言基本數(shù)據(jù)類型總結(jié)

    GO語(yǔ)言基本數(shù)據(jù)類型總結(jié)

    這篇文章主要介紹了GO語(yǔ)言基本數(shù)據(jù)類型,較為詳細(xì)的總結(jié)了GO語(yǔ)言的基本數(shù)據(jù)類型,對(duì)于GO語(yǔ)言的學(xué)習(xí)有一定的借鑒參考價(jià)值,需要的朋友可以參考下
    2014-12-12
  • golang如何去除 context 的 deadline

    golang如何去除 context 的 deadline

    在使用 context 的時(shí)候遇到了開(kāi)協(xié)程處理任務(wù)的情況,但是直接在協(xié)程里使用主線程的 context 會(huì)導(dǎo)致當(dāng)主線程返回時(shí)協(xié)程任務(wù)也會(huì)因?yàn)?nbsp;context cancel 而失敗,本文提供了兩種辦法可以取消掉 context 里的 timeout 和 deadline,再設(shè)置一個(gè)新的 timeout 上去
    2023-03-03

最新評(píng)論

南和县| 莆田市| 包头市| 惠东县| 耿马| 灵寿县| 邵阳市| 多伦县| 阳东县| 阳东县| 吉水县| 瑞昌市| 博湖县| 钟山县| 嘉兴市| 夏河县| 蒙自县| 鄄城县| 阿克| 射洪县| 阿城市| 潮州市| 湖州市| 南漳县| 垫江县| 车险| 正阳县| 麦盖提县| 抚松县| 长岛县| 星座| 儋州市| 巨野县| 三亚市| 蒲江县| 深圳市| 九龙县| 游戏| 白河县| 陆良县| 大田县|