当前位置:网站首页>Golang的range
Golang的range
2022-07-03 08:04:00 【Bel_Ami同学】
Golang range实例
range
是 golang
中特别常用的一种遍历方式,走C++
入门的看到这样的遍历方式感觉太好用了。但是如果没有认真思考过range
的工作原理,在一些特定的场景使用range
,可能并不能达到预期的效果。
1.1 range基础语法
首先我们先来看一下range
的基础语法
一开始认识golang
感觉这门语言对语法的检测特别严谨。比如定义但是没有使用的变量就会报错。
package main
import "fmt"
func main() {
x := []string{
"a", "b", "c"}
for v := range x {
fmt.Println(v) //prints 0, 1, 2
}
for _, v := range x {
fmt.Println(v) //prints a, b, c
}
}
很明显第一个range
返回值为索引值index
,第二个为值value
。一般常见的都是第二种方式 _ ,v = range x
,用_
来丢弃不用的值。当只用一个值来接收range
返回的时候也不会报错,这个就很意外了,并且这个时候返回的为索引值。
1.2 range原理
然后我们来看一下range
的意外状况
package main
import "fmt"
type student struct {
Name string
Age int
}
func main() {
m := make(map[string]*student)
stus := []student{
{
Name: "zhou", Age: 24},
{
Name: "li", Age: 23},
{
Name: "wang", Age: 22},
}
for _, stu := range stus {
m[stu.Name] = &stu
}
for k, v := range m {
fmt.Println(k, "=>", v.Name)
}
}
//输出情况如下,因为遍历map,index为键,value为map中对应的值,每次遍历是无序的
/* li => wang wang => wang zhou => wang */
但是初次遇到这种情况,大家就会发现这和预期的输出不一样。整个map
中的所有实值都是wang。为什么会是这样?
然后我们尝试以下边的代码做输出
fmt.Println(m)
//此时输出内容如下
//map[zhou:0xc000046400 li:0xc000046400 wang:0xc000046400]
我们会发现map[string]*student
中的 *student
最终存储的值都是一样的。究其原因如下:range
是使用一个副本重复赋值的方式来遍历每一个目标元素的,可以将其视为一个目标元素类型的变量,每一次遍历迭代就会把目标元素拷贝到range
准备的副本,并作返回。
修改版:
for k, stu := range stus {
fmt.Println(stu.Name, "=>", &stu)
m[stus[k].Name] = &stus[k]
}
for k,v:=range m{
println(k,"=>",v.Name)
}
或者
for i:=0;i<len(stus);i++ {
m[stus[i].Name] = &stus[i]
}
for k,v:=range m{
println(k,"=>",v.Name)
}
下面是两个range
嵌套使用实例:
// setReqBodyLog 请求的body数据落日志
func setReqBodyLog(ctx context.Context, req *http.Request) {
formMap := map[string]string{
}
for k, v := range req.PostForm {
for _, formV := range v {
if formMap[k] == "" {
formMap[k] = desensitization.RemoveSensetive(formV)
} else {
formMap[k] += "," + desensitization.RemoveSensetive(formV)
}
}
}
logit.ReplaceMetaFields(ctx, logit.AutoField(transmitEntities.LogReqBody, formMap))
}
边栏推荐
- Luaframwrok handles resource updates
- Uniapp learning records
- Idea dereference display effect
- [MySQL 12] MySQL 8.0.18 reinitialization
- How can entrepreneurial teams implement agile testing to improve quality and efficiency? Voice network developer entrepreneurship lecture Vol.03
- Redis profile
- [cocos creator] get the resource UUID
- Maxcompute string splitting function -split_ PART
- MAE
- [cocos creator] Click the button to switch the interface
猜你喜欢
Project experience sharing: handwritten Chinese character recognition based on Shengsi mindspire
什么是数据类型?数据类型有什么用?
Install cross compiler arm none liunx gnueabihf
PostGIS space function
Editor Extensions
What to do after the browser enters the URL
[cocos creator] Click the button to switch the interface
How to configure GDAL under idea
Scite change background color
Screenshot tool snipaste
随机推荐
A tunnel to all ports of the server
[MySQL 13] if you change your password for the first time after installing mysql, you can skip MySQL password verification to log in
Lua framwrok framework starts
freetype库的移植
Pycharm remote ssh pyenv error: pydev debugger: warning: trying to add breakpoint to file that does
idea取消引用顯示效果
Pat class a 1031 Hello world for u
C language - Introduction - essence Edition - take you into programming (I)
Technical dry goods Shengsi mindspire dynamic transformer with variable sequence length has been released!
haproxy+keepalived集群搭建02
Usage of (case, when) in PostgreSQL
Unity XR realizes interaction (grasping, moving, rotating, transmitting, shooting) -pico
C language learning notes (mind map)
tslib库的移植
[at] ABC 258g - Triangle triples reachable - violence
STM32F103 SPI (pit Diary)
Huawei s5700 switch initialization and configuration Telnet, SSH user methods
The general trend of data news releases the power of visual reporting ----- essays after reading
IP production stream is so close to me
[usaco12mar]cows in a skyscraper g (state compression DP)