首页 > 其他分享 >go中 for循环的坑

go中 for循环的坑

时间:2023-04-26 16:12:32浏览次数:27  
标签:123 name dogSlice Dog dog 切片 循环 go

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)

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

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

标签:123,name,dogSlice,Dog,dog,切片,循环,go
From: https://www.cnblogs.com/codezzz/p/17356387.html

相关文章

  • 17.分类组件Category 动态获取数据
    我们接下来做分类组件Category,这个主要用来管理商品的分类,有一级和二级,可以实现一级与二级之间跳转/pages/category/category.jsx文件内容如下:importReact,{Component}from'react'import{Button,Card,Table,message}from'antd'import{PlusOutlined,......
  • Kotlin基础入门 - for、forEach 循环
    Kotlin基础入门-for、forEach循环liuyong.blog.csdn.net成就一亿技术人!不论身处何方for循环这种操作都随处可见,鉴于大多数Android开发都是从Java转到Kt的,所以我的思路是从Java的使用习惯来讲一些Kt的for、forEach循环方式基础for循环惯性for循环进阶for循......
  • 【go】go语言变量类型 常量 函数基础 函数高级 setuptools将python项目打包 前后端联
    目录昨日回顾使用setuptools将python项目打包前后端联调今日内容1go语言变量类型2常量3函数基础4函数高级补充昨日回顾使用setuptools将python项目打包#https://zhuanlan.zhihu.com/p/624648232#python----》setuptools--》whl包结构 公司内部写了包---》公司内部用---......
  • 循环控制:链表和数组
    循环是常用的流程环节。1//链表控制2//链表控制的优点,是通过指针来定位,那么循环的过程中,即是可变的,实时性很强。3vartmp*datastruct.ListNode4tmp=&datastruct.ListNode{Val:-1,Next:nil}56i:=07fornode:=tmp;node!=......
  • Django4全栈进阶之路19 项目实战(用户管理):user_delete.html用户删除画面设计
    1、模块:<tbody>{%foruserinuser_list%}<tr><td>{{user.username}}</td><td>{{user.email}}</td>......
  • 函数高级、包的使用、if-else、循环、switch、数组
    目录1函数高级2包的使用3if-else4循环5switch6数组1函数高级packagemainimport"fmt"//1函数的参数和返回值都是类型的一部分,函数可以赋值给一个变量//test3函数,接收一个参,参数是函数类型:没有参数没有返回值//test有返回值,返回值是个函数:函数有两个参数,一......
  • centos7 go语言环境安装
    要在CentOS7上安装Go环境,可以按照以下步骤进行操作:1.访问Go官网下载页面(https://golang.google.cn/dl/),并选择适合自己系统的版本和包。2.下载完成后,使用以下命令将下载的tar包解压到/usr/local目录:```sudotar-C/usr/local-xzfgo$VERSION.$OS-$ARCH.tar......
  • Django4全栈进阶之路18 项目实战:登录模块设计
    1、编写函数视图,判定用户名密码,验证通过进入home主页,不通过返回登录页面deflogin_view(request):ifrequest.method=='POST':username=request.POST.get('username')password=request.POST.get('password')print(username)......
  • go channel源码阅读
    gochannel源码阅读channel介绍channel是一个类型管道,通过它可以在groutine之间发送消息核心数据结构channel内部数据结构是固定长度的双向循环列表按顺序往里面写数据,写满之后又从0开始写chan中的两个重要组件是buf和waitq,所有的行为和实现都是围绕着两个组件进行的typ......
  • golang -WARNING: undefined behavior - version of Delve is too old for Go version
    1.背景启动警告 这是idea内置的dlv.exe调试器版本太低了2.解决安装最新的goinstallgithub.com/go-delve/delve/cmd/dlv@latest安装成功后,在golang的安装位置多出来个新的dlv.exe  idea打开配置 写上自己的地址即可下面是我的 重启idea生效......