Go語言中范圍range的使用小結(jié)
一、什么是range
range 是 Go 里 用于遍歷數(shù)據(jù)結(jié)構(gòu)的語法糖,常見用法:
for k, v := range collection {
...
}
它能遍歷的對象包括:
- 數(shù)組 / 切片
- 字符串
- map
- channel
本質(zhì)上:每次循環(huán),range 會返回“索引/鍵 + 值”
二、遍歷數(shù)組 / 切片(最常用)
arr := []int{10, 20, 30}
for i, v := range arr {
fmt.Println(i, v)
}
輸出:
0 10
1 20
2 30
只要值,不要索引
for _, v := range arr {
fmt.Println(v)
}
只要索引
for i := range arr {
fmt.Println(i)
}
三、遍歷字符串
s := "你好,go!"
for i, c := range s {
fmt.Printf("index=%d,char=%c\n", i, c)
}輸出:
index=0,char=你
index=3,char=好
index=6,char=,
index=9,char=g
index=10,char=o
index=11,char=!
注意:
i:字節(jié)索引(不是字符索引)c:rune(Unicode 字符)
對比 Java
| Java | Go |
|---|---|
| char 是 UTF-16 | rune 是 UTF-32 |
| String.length() 不等于字符數(shù) | len(s) 是字節(jié)數(shù) |
| 遍歷字符較繞 | range 天然支持 Unicode |
遍歷中文,Go 用 range 是“正解”
四、遍歷 map
m := map[string]int{
"a": 1,
"b": 2,
}
for k, v := range m {
fmt.Println(k, v)
}
重要特性
- map 遍歷 無序
- 每次運行順序可能不一樣
- Go 刻意這么設(shè)計(防止依賴順序的 bug)
如果需要有序,需這樣處理:
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Println(k, m[k])
}
五、遍歷 channel
在并發(fā)中很有用
ch := make(chan int)
go func() {
ch <- 1
ch <- 2
close(ch)
}()
for v := range ch {
fmt.Println(v)
}
特點:
- 會 一直阻塞
- 直到
channel被close - 非常適合消費協(xié)程產(chǎn)生的數(shù)據(jù)
六、range 的“值拷貝陷阱”
問題代碼
arr := []int{1, 2, 3}
for _, v := range arr {
v = v * 10
}
fmt.Println(arr) // [1 2 3]
為什么沒改?
v是 元素的拷貝- 修改
v不影響原數(shù)組
正確寫法
for i := range arr {
arr[i] *= 10
}
七、什么時候不用 range?
| 場景 | 建議 |
|---|---|
| 需要修改原數(shù)組 | 用索引 for |
| 需要精確控制步長 | 用經(jīng)典 for |
| 性能極限場景 | 手寫 for 更可控 |
| 遍歷 map 順序敏感 | 不適合 |
八、總結(jié)
Go 的 range = 更安全、更簡潔的 for-each,但要記?。?/p>
1. 值是拷貝;
2. map 無序;
3. 字符串按 rune。
到此這篇關(guān)于Go語言中范圍range的使用小結(jié)的文章就介紹到這了,更多相關(guān)Go range內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言中的goroutine和channel如何協(xié)同工作
在Go語言中,goroutine和channel是并發(fā)編程的兩個核心概念,它們協(xié)同工作以實現(xiàn)高效、安全的并發(fā)執(zhí)行,本文將詳細(xì)探討goroutine和channel如何協(xié)同工作,以及它們在并發(fā)編程中的作用和優(yōu)勢,需要的朋友可以參考下2024-04-04
關(guān)于go-micro與其它gRPC框架之間的通信問題及解決方法
在之前的文章中分別介紹了使用gRPC官方插件和go-micro插件開發(fā)gRPC應(yīng)用程序的方式,都能正常走通。不過當(dāng)兩者混合使用的時候,互相訪問就成了問題,下面通過本文給大家講解下go-micro與gRPC框架通信問題,一起看看吧2022-04-04
go語言VScode?see?'go?help?modules'?(exit?statu
最近上手學(xué)習(xí)go語言,準(zhǔn)備在VSCode上寫程序的時候卻發(fā)現(xiàn)出了一點問題,下面這篇文章主要給大家介紹了關(guān)于go語言VScode?see?'go?help?modules'(exit?status?1)問題的解決過程,需要的朋友可以參考下2022-07-07
使用Go語言創(chuàng)建error的幾種方式小結(jié)
Go語言函數(shù)(或方法)是支持多個返回值的,因此在Go語言的編程哲學(xué)中,函數(shù)的返回值的最后一個通常都是error類型,所以本文給大家介紹了使用Go語言創(chuàng)建error的幾種方式小結(jié),文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-01-01
Go語言中函數(shù)的參數(shù)傳遞與調(diào)用的基本方法
這篇文章主要介紹了Go語言中函數(shù)的參數(shù)傳遞與調(diào)用的基本方法,是golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-10-10

