go語(yǔ)言語(yǔ)法基礎(chǔ)的全面梳理(適合入門(mén))
前言
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 <- 10 // 發(fā)送 10 到通道,阻塞直到接收
fmt.Println("發(fā)送完成")
}
func main() {
ch := make(chan int) // 無(wú)緩沖通道(容量默認(rèn) 0)
go send(ch) // 啟動(dòng)發(fā)送 goroutine
val := <-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 <- 1 // 發(fā)送成功(緩沖區(qū)未滿)
ch <- 2 // 發(fā)送成功(緩沖區(qū)未滿)
// ch <- 3 // 阻塞(緩沖區(qū)滿)
fmt.Println(<-ch) // 接收 1,緩沖區(qū)剩余 1
fmt.Println(<-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 < 3; i++ {
ch <- 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 <= 3; i++ {
wg.Add(1) // 啟動(dòng) goroutine 前計(jì)數(shù)器+1
go work(i, &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 < 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/http | HTTP 客戶端 / 服務(wù)端 | http.Get()、http.HandleFunc() |
encoding/json | JSON 序列化 / 反序列化 | 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)文章希望大家以后多多支持腳本之家!
- Go語(yǔ)言入門(mén)教程之基礎(chǔ)語(yǔ)法快速入門(mén)
- Go語(yǔ)言基礎(chǔ)知識(shí)總結(jié)(語(yǔ)法、變量、數(shù)值類型、表達(dá)式、控制結(jié)構(gòu)等)
- go語(yǔ)言基礎(chǔ)語(yǔ)法示例
- Go語(yǔ)言基礎(chǔ)語(yǔ)法之結(jié)構(gòu)體及方法詳解
- Go語(yǔ)言入門(mén)之基礎(chǔ)語(yǔ)法和常用特性解析
- Go語(yǔ)言基礎(chǔ)語(yǔ)法和基本數(shù)據(jù)類型知識(shí)鞏固
- 手把手帶你走進(jìn)Go語(yǔ)言之語(yǔ)法基礎(chǔ)解析
- Go語(yǔ)言語(yǔ)法基礎(chǔ)之算術(shù)符示例詳解
相關(guā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-gin-mgo高并發(fā)服務(wù)器搭建教程
這篇文章主要介紹了golang-gin-mgo高并發(fā)服務(wù)器搭建教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
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)的空白換行
最近在使用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ù)類型,較為詳細(xì)的總結(jié)了GO語(yǔ)言的基本數(shù)據(jù)類型,對(duì)于GO語(yǔ)言的學(xué)習(xí)有一定的借鑒參考價(jià)值,需要的朋友可以參考下2014-12-12

