go中 for循环的坑

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

go中 for循环的坑

在使用for循环修改结构体切片中的值时,发现并没有修改成功。

type Dog struct {
	name string
}

func (d *Dog) setNewName(name string) {
	d.name = name
}

func main() {
	d := Dog{
		name: "123",
	}
	d1 := Dog{
		name: "456",
	}
	d2 := Dog{
		name: "789",
	}
	dogSlice := make([]Dog, 0)
	dogSlice = append(dogSlice, d, d1, d2)
	for _, dog := range dogSlice {
		dog.setNewName("123")
	}
	for _, dog := range dogSlice {
		fmt.Println(dog)
	}
}

结果切片中dog的name并没有全部变为123,后来查资料才知道for循环中的dog其实是个变量,指向的并不是真正的dog。

打印其地址对比可以看出压根就不同。

for i, dog := range dogSlice {
		fmt.Printf("dog地址:%p 切片中dog的真正地址:%p\n", &dog, &(dogSlice[i]))
}

dog地址:0x14000010230 切片中dog的真正地址:0x14000066180
dog地址:0x14000010230 切片中dog的真正地址:0x14000066190
dog地址:0x14000010230 切片中dog的真正地址:0x140000661a0

若要修改切片中的dog的name,应该按照以下这么写,或者将dogSlice变为存dog指针的切片,dogSlice := make([]*Dog, 0)文章来源地址https://www.toymoban.com/news/detail-425997.html

for i, _ := range dogSlice {
		dogSlice[i].setNewName("123")
}
for _, v := range dogSlice {
		fmt.Println(v)
}

打印如下:
{123}
{123}
{123}

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

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

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

相关文章

  • go语言中的切片

    切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一个引用类型,它的内部结构包含 地址 、 长度 和 容量 。切片一般用于快速地操作一块数据集合。 切片的本质就是对底层数组的封装,它包含了

    2024年02月11日
    浏览(30)
  • Go语言中的数组、切片和映射解析

    数组存放的是固定长度、相同类型的数据,而且这些存放的元素是连续的。 例如声明一个整形数组: 在类型名前加 [] 中括号,并设置好长度,大括号中的元素用于初始化数组,需要注意的是数组的长度不同,即属于不同的类型。 如果所有元素都被初始化的数组,声明时可以

    2024年02月09日
    浏览(38)
  • 【Go 基础篇】深入探索:Go语言中的切片遍历与注意事项

    嗨,Go语言学习者!在我们的编程旅程中,切片(Slice)是一个极其重要的工具。它可以帮助我们处理各种类型的数据,从而让我们的代码更加灵活和高效。本文将围绕Go语言中切片的遍历方法以及在遍历时需要注意的事项进行探讨,帮助你更好地理解和应用切片。 切片的遍历

    2024年02月11日
    浏览(31)
  • Go的for循环

    在Go语言中,循环是通过for来实现的。Go语言提供了三种基本的循环方式:for循环、range循环和for...range循环。 初始化语句用于初始化循环变量;循环条件为真时执行循环体代码;循环后执行语句在每次循环结束后执行。例如: 以上代码会输出0到4的数字。 range循环用于

    2024年02月11日
    浏览(21)
  • 理解 Go 中的切片:append 操作的深入分析(篇2)

    理解 Go 语言中 slice 的性质对于编程非常有益。下面,我将通过代码示例来解释切片在不同函数之间传递并执行 append 操作时的具体表现。 本篇为第 2 篇,当切片的容量 cap 不够时 输出: 解释:在 test1 函数中,我们首先将 slice2 的第一个元素设为 1(这个更改也反映在 slice1

    2024年02月13日
    浏览(26)
  • 【Python】Python 中使用for循环取返回值 json 中的指定值

    每天进步一点点~~ 背景:最近在写接口自动化的案例,其中一个功能是在es里面造数,但是在造数前需要将原值清空,这样会更方便直接一些;查询接口会返回一个特定值:‘_id’,删除接口需要这个值进行指定删除,返回结果是一段 json 串,要从里面取出需要的值 代码举例

    2024年01月22日
    浏览(30)
  • js在循环中使用正则失效异常的坑

    1、异常案例: 使用正则匹配111 why? 首先去MDN看了看正则的基础概念。 发现了lastIndex 这个属性。 2、原因分析     用正则表达式只要设置了全局匹配标志 /g ,test()方法 的执行就会改变正则表达式 lastIndex 属性。再循环中连续的执行 test() 方法,后面的执行将会从 lastIndex 数

    2024年02月01日
    浏览(19)
  • Go 语言为什么建议多使用切片,少使用数组?

    大家好,我是 frank,「Golang 语言开发栈」公众号作者。 01 介绍 在 Go 语言中,数组固定长度,切片可变长度;数组和切片都是值传递,因为切片传递的是指针,所以切片也被称为“引用传递”。 读者朋友们在使用 Go 语言开发项目时,或者在阅读 Go 开源项目源码时,发现很少

    2024年02月03日
    浏览(59)
  • Go语言程序设计(十)选择结构和循环结构

    在Go语言中,共提供三种形式的if语句: if语句 if else语句 if else if语句 if语句的注意事项: 左大括号“{”必须和if语句放在同一行,否则编译会出错 条件表达式和if之间使用空格隔开即可,表达式无需用括号括起来 支持初始化条件表达式,如if a:=1; a0。在这条语句中,先

    2024年02月12日
    浏览(32)
  • 小白学go基础06-了解切片实现原理并高效使用

    slice,中文多译为切片,是Go语言在数组之上提供的一个重要的抽象数据类型。在Go语言中,对于绝大多数需要使用数组的场合,切片实现了完美替代。并且和数组相比,切片提供了更灵活、更高效的数据序列访问接口。 在对切片一探究竟之前,我们先来简单了解一下Go语言中

    2024年02月09日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包