欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語(yǔ)言范圍Range的具體使用

 更新時(shí)間:2024年01月09日 09:38:58   作者:242030  
range關(guān)鍵字在for循環(huán)中用于遍歷數(shù)組,切片,通道或映射的項(xiàng)目,本文主要介紹了Go語(yǔ)言范圍Range的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下

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也可以用來枚舉 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)
}
// 通過 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)文章

  • go sync Once實(shí)現(xiàn)原理示例解析

    go sync Once實(shí)現(xiàn)原理示例解析

    這篇文章主要為大家介紹了go sync Once實(shí)現(xiàn)原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Go語(yǔ)言實(shí)現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法

    Go語(yǔ)言實(shí)現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法,以實(shí)例形式詳細(xì)分析了幾種常見的排序技巧與實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Golang 并發(fā)以及通道的使用方式

    Golang 并發(fā)以及通道的使用方式

    這篇文章主要介紹了Golang 并發(fā)以及通道的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例

    golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例

    這篇文章主要為大家介紹了golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Golang等多種語(yǔ)言轉(zhuǎn)數(shù)組成字符串舉例詳解

    Golang等多種語(yǔ)言轉(zhuǎn)數(shù)組成字符串舉例詳解

    今天寫代碼遇到數(shù)組轉(zhuǎn)換成字符串操作,下面這篇文章主要給大家介紹了關(guān)于Golang等多種語(yǔ)言轉(zhuǎn)數(shù)組成字符串的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • golang實(shí)現(xiàn)跨域訪問的方法

    golang實(shí)現(xiàn)跨域訪問的方法

    這篇文章主要介紹了golang實(shí)現(xiàn)跨域訪問的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • golang goroutine順序輸出方式

    golang goroutine順序輸出方式

    這篇文章主要介紹了golang goroutine順序輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go1.18?新特性之多模塊Multi-Module工作區(qū)模式

    Go1.18?新特性之多模塊Multi-Module工作區(qū)模式

    這篇文章主要介紹了Go1.18?新特性之多模塊Multi-Module工作區(qū)模式,在 Go 1.18之前,建議使用依賴模塊中的 replace 指令來處理這個(gè)問題,從 Go 1.18開始引入了一種同時(shí)處理多個(gè)模塊的新方法,通過案例給大家詳細(xì)介紹,感興趣的朋友一起看看吧
    2022-04-04
  • win7下配置GO語(yǔ)言環(huán)境 + eclipse配置GO開發(fā)

    win7下配置GO語(yǔ)言環(huán)境 + eclipse配置GO開發(fā)

    這篇文章主要介紹了win7下配置GO語(yǔ)言環(huán)境 + eclipse配置GO開發(fā),需要的朋友可以參考下
    2014-10-10
  • 用go gin server來做文件上傳服務(wù)

    用go gin server來做文件上傳服務(wù)

    今天小編就為大家分享一篇關(guān)于用go gin server來做文件上傳服務(wù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04

最新評(píng)論