網站首頁 編程語言 正文
GO 語言的 for…range 能做什么呢?
for…range 如何使用 ?
for…range 的返回值有哪些情況,可以對于任何數據結構使用嗎?
for…range 的返回值如果不需要,可以如何處理?
for…range 的數據是如何傳遞的?
剛學習 golang 的 xdm 會不會有上面的疑問?其實很簡單,我們就一個一個的來分享和實操一遍
GO 語言的 for…range 能做什么呢?
golang 的 for…range 是 go 自身的語法,可以用來遍歷數據結構,有如下數據結構可以遍歷
- 切片 slice
- 數組 array
- map 哈希表
- channel 通道
for…range 如何使用 ?
我們分別來看看可以如何使用他們,for…range 相當于一個迭代器,可以遍歷數據結構的鍵/索引 和值
數組 array
- 初始化一個數組
- 使用 for…range 遍歷 , 對應的是 索引 和 值
func main() { ?? ?myArray := [5]int{1, 2, 3, 4, 5} ?? ?for i, v := range myArray { ?? ??? ?fmt.Printf("%d -- %d -- %p\n", i, v, &v) ?? ?} }
切片 slice
- 初始化一個切片
- 使用 for…range 遍歷 , 對應的是 索引 和 值
mySlice := []int{1, 2, 3, 4, 5} for i, v := range mySlice { fmt.Printf("%d -- %d -- %p\n", i, v, &v) }
map 哈希表
- 初始化一個 map 哈希表
- 使用 for…range 遍歷 , map 對應的 鍵值對
myMap := map[string]string{ "name": "xmt", "hobby": "program", "addr": "mengli", } for k, v := range myMap { fmt.Printf("%s -- %s -- %p\n", k, v, &v) }
channel 通道
- 創建一個可以緩沖 10 個 int 類型數據的通道
- 創建一個協程專門向通道中寫入數據
- 主協程遍歷通道,讀取數據
package main import "fmt" var myCh = make(chan int, 10) func writeCh() { ?? ?for i := 0; i < 5; i++ { ?? ??? ?myCh <- i ?? ?} ?? ?close(myCh) } func main() { ?? ?go writeCh() ?? ?for { ?? ??? ?for data := range myCh { ?? ??? ??? ?fmt.Println(data) ?? ??? ?} ?? ??? ?break ?? ?} }
for…range 的返回值有哪些情況,可以對于任何數據結構使用嗎?
并不是所有數據結構都可以使用 for…range 的,如下結構可以使用這個方法
返回值 1 | 返回值 2 | 數據傳遞 | |
---|---|---|---|
字符串 | 索引 | 索引對應的值 | 值傳遞 |
數組或者切片 | 索引 | 索引對應的值 | 數組:值傳遞 切片:引用傳遞 |
哈希表 | 鍵 | 鍵對應的值 | 指針 |
通道 | 通道中的數據 | 指針 |
for…range 的返回值如果不需要,可以如何處理?
相信寫過 golang 的 xdm 都知道,go 里面對于我們不需要的返回值,都可以使用 - 來表示 ,因此 for…range 當然也可以這樣
例如:
myMap := map[string]string{ "name": "xmt", "hobby": "program", "addr": "mengli", } for _, v := range myMap { fmt.Printf("%s -- %p\n", v, &v) }
for…range 的數據是如何傳遞的?
數據都是通過復制傳遞的,也就是都是值傳遞的,只不過由于數據結構不一樣,數組和切片在這里還是有一些區別的
前面的文章,我們有說到,切片,對應著 有 3 個元素的數據結構,一個是 cap,一個是 len, 一個是 ptr ,指向的是一個底層數組
切片是引用傳遞,但是傳遞數據的時候,切片這個變量是值傳遞,但是它實際指向的底層數組還是不會變的
咱們來寫一個 demo 查看一下:
我們思路是這個樣子:
遍歷一個 數組/切片,在遍歷當前值的時候,去修改后面索引對應的值,全部遍歷完畢后,查看結果中,實際的數據是否會被修改掉,若修改掉了,則是切片是傳引用,若沒有修改掉,則是數組是傳值
數組的效果
myArray := [5]int{1, 2, 3, 4, 5} fmt.Println(myArray) for i, v := range myArray { ? ? if ?i == 0{ ? ? ? ? myArray[2] = 888 ? ? } ? ? fmt.Printf("%d -- %d -- %p\n", i, v, &myArray[i]) }
效果如下:
go run main.go
[1 2 3 4 5]
0 -- 1 -- 0x1189c120
1 -- 2 -- 0x1189c124
2 -- 3 -- 0x1189c128
3 -- 4 -- 0x1189c12c
4 -- 5 -- 0x1189c130
切片的效果
mySlice := []int{1, 2, 3, 4, 5} fmt.Println(mySlice) for i, v := range mySlice { if i == 0{ mySlice[2] = 888 } fmt.Printf("%d -- %d -- %p\n", i, v, &mySlice[i]) }
效果如下:
go run main.go
[1 2 3 4 5]
0 -- 1 -- 0x1140e340
1 -- 2 -- 0x1140e344
2 -- 888 -- 0x1140e348
3 -- 4 -- 0x1140e34c
4 -- 5 -- 0x1140e350
通過上述的案例,相信心里都有點譜了吧
原文鏈接:https://blog.csdn.net/m0_37322399/article/details/128944022
相關推薦
- 2022-06-30 Python利用shutil模塊實現文件夾的復制刪除與裁剪_python
- 2022-11-17 獲取C++變量類型的簡單方法_C 語言
- 2022-08-01 為MongoDB數據庫注冊windows服務_MongoDB
- 2022-01-05 npm ERR! code ENOENT npm ERR! syscall open npm ERR
- 2022-07-21 python logging模塊使用介紹
- 2023-02-05 Python實現前向和反向自動微分的示例代碼_python
- 2023-01-04 go?doudou應用中使用枚舉類型教程示例_Golang
- 2023-02-17 react生命周期(類組件/函數組件)操作代碼_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支