Go for Range遍历

这篇具有很好参考价值的文章主要介绍了Go for Range遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

func main() {
    v := []int{1, 2, 3}
    for i:= range v {
        v = append(v, i)
    }
}
//结果如下
[1 2 3 0 1 2]

 遍历slice的时候会先获取slice的长度作为循环次数,在遍历过程中添加的元素不会被遍历到,map插入数据的位置是随机的,所以遍历过程中新插入的数据不能保证遍历到。

for range 中的值拷贝

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 {
		stu =  student{}
		fmt.Println(stu)
	}
	fmt.Println(stus)
}
{ 0}
{ 0}
{ 0}
[{zhou 24} {li 23} {wang 22}]

在forrange的过程中,数据会进行一次拷贝,我们如果直接对拷贝的数据进行操作是无法改变原来的数据的。那如果我们想要改变切片中的数据的话,我们应该怎么做?

方案一:根据索引进行更新,对第二个参数进行忽略

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 i, _ := range stus {
		stus[i] =  student{}

	}
	fmt.Println(stus)
}
//结果为[{ 0} { 0} { 0}]

方案二:使用切片指针

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 _, value := range stus {
		 value = &student{"z",1}
		 fmt.Println(value)
	}

	for i := 0; i < len(stus); i++ {
		fmt.Println(stus[i])
	}
}
//结果如下
&{z 1}
&{z 1}
&{z 1}
&{zhou 24}
&{li 23}
&{wang 22}

在这段代码里面,value是值拷贝,拷贝的是一个指针,我们直接把该指针指向了一个另外一个地址,&student{"z",1},所以原来的值是不会进行改变的。

下面是使用切片指针的正确用法

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 _, value := range stus {
		 value.Name = "大子杰"
	}

	for i := 0; i < len(stus); i++ {
		fmt.Println(stus[i])
	}
}
&{大子杰 24}
&{大子杰 23}
&{大子杰 22}

value是值拷贝,但是拷贝的是一个指针,该指针指向底层数组和stus切片指向的底层数组是相同的。文章来源地址https://www.toymoban.com/news/detail-537680.html

package main

import "fmt"

type Customer struct {
	ID string
	Balance float64
}
type Store struct {
	Customers map[string]*Customer
}
func main() {
	s := &Store{Customers: map[string]*Customer{}}
	s.storeCustomers([]Customer{
		{ID: "1", Balance: 10},
		{ID: "2", Balance: -10},
		{ID: "3", Balance: 0},
	})
	for i, v := range s.Customers {
		fmt.Printf("id=%s,customer=%+v\n", i, v)
	}
}
func (s *Store) storeCustomers(customers []Customer) {
	//customer是一份拷贝,这份拷贝的地址只是被创建了一次,地址是固定的
	for _, customer := range customers {
		s.Customers[customer.ID] = &customer
	}
}
//结果如下:
id=1,customer=&{ID:3 Balance:0}
id=2,customer=&{ID:3 Balance:0}
id=3,customer=&{ID:3 Balance:0}

到了这里,关于Go for Range遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Golang】go编程语言适合哪些项目开发?

    前言 在当今数字化时代,软件开发已成为各行各业的核心需求之一。 而选择适合的编程语言对于项目的成功开发至关重要。 本文将重点探讨Go编程语言适合哪些项目开发,以帮助读者在选择合适的编程语言时做出明智的决策。 Go 编程语言适合哪些项目开发? Go是由Google开发

    2024年02月04日
    浏览(80)
  • go中for range的坑以及解决方案

    相信小伙伴都遇到过以下的循环变量的问题,那是因为循环的val变量是重复使用的,即仅有一份。也就是说,每次循环后赋给val的值就会把前面循环赋给val的值替换掉,所以打印出来的值都是最后一次循环赋给val的值。 使用局部变量/临时变量,即可解决         可以设置

    2024年01月25日
    浏览(39)
  • 【Go】Go 语言教程--Go 语言范围(Range)(十五)

    往期回顾: Go 语言教程–介绍(一) Go 语言教程–语言结构(二) Go 语言教程–语言结构(三) Go 语言教程–数据类型(四) Go 语言教程–语言变量(五) Go 语言教程–GO语言常量(六) Go 语言教程–GO语言运算符(七) Go 语言教程–GO条件和循环语句(八) Go 语言教程

    2024年02月16日
    浏览(47)
  • 【Golang】VsCode下开发Go语言的环境配置(超详细图文详解)

    📓推荐网站(不断完善中):个人博客 📌个人主页:个人主页 👉相关专栏:CSDN专栏、个人专栏 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 ​ 话说在前,Go语言的编码方式是 UTF-8 ,理论上你直接使用文本进行编辑也是可以的,当然为了提升我们的开发效率我们还是需

    2024年02月07日
    浏览(86)
  • Go语言范围Range

    Go 语言中 range 用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数 组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。 for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。 涉及指针时需要注意,v 是个

    2024年02月11日
    浏览(38)
  • Golang for循环遍历小坑

    循环:让程序多次执行相同的代码块 for循环是Go语言中唯一一个循环结构 for循环经典语法 先执行表达式1 执行表达式2判断是否成立,如果成立执行循环体 循环体执行完成后,执行表达式3 再次执行表达式2,判断是否成立. for循环用的最多的地方就是遍历数组或切片等 经典for循环结

    2024年02月03日
    浏览(41)
  • 为什么 Go for-range 的 value 值地址每次都一样?

    原文链接: 为什么 Go for-range 的 value 值地址每次都一样? 循环语句是一种常用的控制结构,在 Go 语言中,除了 for 以外,还有一个 range ,可以使用 for-range 循环迭代数组、切片、字符串、map 和 channel 这些数据类型。 但是在使用 for-range 循环迭代数组和切片的时

    2024年02月01日
    浏览(49)
  • 掌握Go语言:精通Go语言范围(range),高级应用及进销存系统实战(25)

    Go语言的范围(range)除了基本的遍历数组、切片、映射和通道外,还具有一些高级用法,包括: Go语言的范围高级用法 1. 使用下划线忽略索引或值 在Go语言中,使用下划线 _ 可以在范围语句中忽略索引或值,这在我们只关注其中一项时非常有用,可以提高代码的可读性。 示

    2024年04月12日
    浏览(51)
  • Go For Web:Golang http 包详解(源码剖析)

    本文作为解决如何通过 Golang 来编写 Web 应用这个问题的前瞻,对 Golang 中的 Web 基础部分进行一个简单的介绍。目前 Go 拥有成熟的 Http 处理包,所以我们去编写一个做任何事情的动态 Web 程序应该是很轻松的,接下来我们就去学习了解一些关于 Web 的相关基础,了解一些概念,

    2023年04月14日
    浏览(35)
  • go语言遍历进程模块dll

    === RUN   TestPsUtil Index= 1 C:UsersADMINI~1AppDataLocalTempgo-build4126345986b001Te Index= 2 C:WindowsSYSTEM32ntdll.dll Index= 3 C:Windowssystem32kernel32.dll Index= 4 C:Windowssystem32KERNELBASE.dll Index= 5 C:Windowssystem32advapi32.dll Index= 6 C:Windowssystem32msvcrt.dll Index= 7 C:WindowsSYSTEM32sechost.dll Index= 8 C:Windo

    2024年02月04日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包