Go語(yǔ)言范圍Range的具體使用
Go 語(yǔ)言中 range 關(guān)鍵字用于 for 循環(huán)中迭代數(shù)組(array)、切片(slice)、通道(channel)或集合(map)的元素。在數(shù)組和切片中它返回元素的索引和索引對(duì)應(yīng)的值,在集合中返回 key-value 對(duì)。
for 循環(huán)的 range 格式可以對(duì) slice、map、數(shù)組、字符串等進(jìn)行迭代循環(huán)。
// 格式如下
// 代碼中的key和value是可以省略的
for key, value := range oldMap {
newMap[key] = value
}
// 如果只想讀取key,格式如下 for key := range oldMap // 或者 for key, _ := range oldMap
// 如果只想讀取value,格式如下 for _, value := range oldMap
// 遍歷簡(jiǎn)單的數(shù)組,2**%d的結(jié)果為索引對(duì)應(yīng)的次方數(shù)
package main
import "fmt"
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
func main() {
/*
2**0 = 1
2**1 = 2
2**2 = 4
2**3 = 8
2**4 = 16
2**5 = 32
2**6 = 64
2**7 = 128
*/
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}
# 程序輸出
2**0 = 1
2**1 = 2
2**2 = 4
2**3 = 8
2**4 = 16
2**5 = 32
2**6 = 64
2**7 = 128
// for循環(huán)的range格式可以省略key和value
package main
import "fmt"
func main() {
map1 := make(map[int]float32)
map1[1] = 1.0
map1[2] = 2.0
map1[3] = 3.0
map1[4] = 4.0
/*
key is: 1 - value is: 1.000000
key is: 2 - value is: 2.000000
key is: 3 - value is: 3.000000
key is: 4 - value is: 4.000000
*/
// 讀取 key 和 value
for key, value := range map1 {
fmt.Printf("key is: %d - value is: %f\n", key, value)
}
/*
key is: 1
key is: 2
key is: 3
key is: 4
*/
// 讀取 key
for key := range map1 {
fmt.Printf("key is: %d\n", key)
}
/*
value is: 1.000000
value is: 2.000000
value is: 3.000000
value is: 4.000000
*/
// 讀取 value
for _, value := range map1 {
fmt.Printf("value is: %f\n", value)
}
}
// range遍歷其他數(shù)據(jù)結(jié)構(gòu)
package main
import "fmt"
func main() {
//這是我們使用 range 去求一個(gè) slice 的和。使用數(shù)組跟這個(gè)很類似
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
// sum: 9
fmt.Println("sum:", sum)
//在數(shù)組上使用 range 將傳入索引和值兩個(gè)變量。上面那個(gè)例子我們不需要使用該元素的序號(hào),所以我們使用空白符"_"省略了。有時(shí)侯我們確實(shí)需要知道它的索引。
for i, num := range nums {
if num == 3 {
// index: 1
fmt.Println("index:", i)
}
}
//range 也可以用在 map 的鍵值對(duì)上。
kvs := map[string]string{"a": "apple", "b": "banana"}
/*
a -> apple
b -> banana
*/
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
/*
0 103
1 111
*/
//range也可以用來(lái)枚舉 Unicode 字符串。第一個(gè)參數(shù)是字符的索引,第二個(gè)是字符(Unicode的值)本身。
for i, c := range "go" {
fmt.Println(i, c)
}
}
// Range 簡(jiǎn)單循環(huán)
package main
import "fmt"
func main() {
nums := []int{1, 2, 3, 4}
length := 0
for range nums {
length++
}
// 4
fmt.Println(length)
}
// 通過(guò) range 獲取參數(shù)列表
package main
import (
"fmt"
"os"
)
func main() {
// 1
fmt.Println(len(os.Args))
for _, arg := range os.Args {
// C:\Users\zhangshixing\AppData\Local\Temp\___go_build_hello_go.exe
fmt.Println(arg)
}
}
// Go 中的中文采用UTF-8編碼,因此逐個(gè)遍歷字符時(shí)必須采用for-each形式
package main
import "fmt"
func main() {
// str: hello
// 0x68 h, 0x65 e, 0x6c l, 0x6c l, 0x6f o,
// 0x68, 0x65, 0x6c, 0x6c, 0x6f,
printStr("hello")
fmt.Println()
fmt.Println()
// str: 中國(guó)人
// 0x4e2d 中, 0x56fd 國(guó), 0x4eba 人,
// 0xe4, 0xb8, 0xad, 0xe5, 0x9b, 0xbd, 0xe4, 0xba, 0xba,
printStr("中國(guó)人")
}
func printStr(s string) {
fmt.Println("str: " + s)
for _, v := range s {
fmt.Printf("0x%x %c, ", v, v)
}
fmt.Println()
for i := 0; i < len(s); i++ {
fmt.Printf("0x%x, ", s[i])
}
}
涉及指針時(shí)需要注意,v 是個(gè)單獨(dú)的地址:
package main
import "fmt"
func main() {
nums := [3]int{5, 6, 7}
/*
源值地址: 0xc00000c108 value的地址: 0xc000016098
源值地址: 0xc00000c110 value的地址: 0xc000016098
源值地址: 0xc00000c118 value的地址: 0xc000016098
*/
for k, v := range nums {
fmt.Println("源值地址:", &nums[k], " \t value的地址:", &v)
}
}
range復(fù)用臨時(shí)變量:
package main
import "sync"
func main() {
wg := sync.WaitGroup{}
si := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
for i := range si {
wg.Add(1)
go func() {
print(i)
wg.Done()
}()
}
wg.Wait()
}
# 程序輸出
9999999999
導(dǎo)致這樣結(jié)果的原因是:
(1)、for range 下的迭代變量i的值是共用的。
(2)、main函數(shù)所在的 goroutine 和后續(xù)啟動(dòng)的 goroutines 存在競(jìng)爭(zhēng)關(guān)系。
package main
import "sync"
func main() {
wg := sync.WaitGroup{}
si := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
for i := range si {
wg.Add(1)
// 這里有一個(gè)實(shí)參到形參的值拷貝
go func(a int) {
print(a)
wg.Done()
}(i)
}
wg.Wait()
}
# 程序輸出
9865207314
到此這篇關(guān)于Go語(yǔ)言范圍Range的具體使用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言范圍Range內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以)
這篇文章主要介紹了Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以),本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
深入探究Go語(yǔ)言的錯(cuò)誤策略與異常機(jī)制
本文深入探討了Go語(yǔ)言的錯(cuò)誤策略與異常機(jī)制,主要介紹了錯(cuò)誤處理的重要性,以及Go語(yǔ)言中的錯(cuò)誤類型和處理函數(shù),此外還討論了Go語(yǔ)言的異常機(jī)制,包括panic和recover函數(shù)的使用,需要的朋友可以參考下2024-02-02
MacOS中 VSCode 安裝 GO 插件失敗問(wèn)題的快速解決方法
這篇文章主要介紹了MacOS中 VSCode 安裝 GO 插件失敗問(wèn)題的快速解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Golang實(shí)現(xiàn)異步上傳文件支持進(jìn)度條查詢的方法
這篇文章主要介紹了Golang實(shí)現(xiàn)異步上傳文件支持進(jìn)度條查詢的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Go中g(shù)routine通信與context控制實(shí)例詳解
隨著context包的引入,標(biāo)準(zhǔn)庫(kù)中很多接口因此加上了context參數(shù),下面這篇文章主要給大家介紹了關(guān)于Go中g(shù)routine通信與context控制的相關(guān)資料,需要的朋友可以參考下2022-02-02
Golang中函數(shù)(Function)和方法(Method)的區(qū)別詳解
在Golang中,大家必然會(huì)頻繁使用到函數(shù)(Function)和方法(Method),但是有的同學(xué)可能并沒(méi)有注意過(guò)函數(shù)和方法的異同點(diǎn),函數(shù)和方法都是用來(lái)執(zhí)行特定任務(wù)的代碼塊,雖然很相似,但也有很大的區(qū)別,所以本文將詳細(xì)講解函數(shù)和方法的定義以及它們的異同點(diǎn)2023-07-07

