MAP ITERation 트랩으로 이동 : 왜 모든 값이 마지막 요소를 가리십니까?
GO for...range
map
데이터 구조와 함께 사용될 때, 공통 트랩이 발생하기 쉽다 : 슬라이스를 가로 지르고 map
에 요소를 추가 할 때, 모든 map
값은 결국 마지막 요소를 가리킨다. 이 기사는 코드 예제를 통해 그 이유를 분석하고 솔루션을 제공합니다.
코드를 살펴 보겠습니다.
유형 학생 struct { 이름 문자열 나이 int } func main () { m : = make (map [String]*학생) 학생 : = [] 학생 { {이름 : "pprof.cn", 나이 : 18}, {이름 : "테스트", 나이 : 23}, {이름 : "블로그", 나이 : 28}, } _, stu : = 범위 학생 { m [stu.name] = & stu // 문제가 여기 있습니다} K, V : = 범위 m { fmt.println (k, "=>", v.name) } }
이 코드의 예상 결과는 각 Student
구조를 students
에게 map
에 저장하는 것입니다. 그러나 실행 결과는 모든 map
값이 마지막 요소 "블로그"를 가리 킵니다.
<code>pprof.cn => 博客测试=> 博客博客=> 博客</code>
문제의 근본 : for...range
루프의 가변 범위
문제는 for...range
루프에서 stu
변수가 모든 반복마다 새로운 변수를 생성하지는 않는다는 것입니다. students
슬라이스에서 동일한 메모리 주소를 가리 킵니다. 각 반복, stu
의 값은 업데이트되지만 메모리 주소는 동일하게 유지됩니다. 따라서 루프가 끝나면 map
의 모든 포인터는 stu
(마지막 요소)의 최종 값을 가리 킵니다.
해결책 : 변수의 새 사본을 만듭니다
이 문제를 해결하려면 각 반복에 stu
변수 사본을 만들어 map
다른 메모리 주소를 저장해야합니다. 수정 된 코드는 다음과 같습니다.
_, stu : = 범위 학생 { newstu : = stu // 사본 만들기 m [newstu.name] = & newstu }
또는보다 간결한 방법은 새로운 Student
구조를 직접 만드는 것입니다.
_, stu : = 범위 학생 { m [stu.name] = & student {이름 : stu.name, age : stu.age} // 새로운 학생 인스턴스 생성}
위의 수정을 사용하면 map
의 각 값은 다른 메모리 주소를 가리 며 모든 값이 마지막 요소를 가리키는 경우를 피합니다. 수정 된 코드를 실행하면 예상 결과가 나타납니다.
이 설명이 for...range
Loops 및 map
데이터 구조의 세부 사항을 이해하는 데 도움이되기를 바랍니다. 이러한 트랩을 피하십시오.
위 내용은 Go Language to Traverse 슬라이스 및 매장 맵에 범위를 사용할 때 모든 값이 마지막 요소가되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

go语言有缩进。在go语言中,缩进直接使用gofmt工具格式化即可(gofmt使用tab进行缩进);gofmt工具会以标准样式的缩进和垂直对齐方式对源代码进行格式化,甚至必要情况下注释也会重新格式化。

go语言叫go的原因:想表达这门语言的运行速度、开发速度、学习速度(develop)都像gopher一样快。gopher是一种生活在加拿大的小动物,go的吉祥物就是这个小动物,它的中文名叫做囊地鼠,它们最大的特点就是挖洞速度特别快,当然可能不止是挖洞啦。

是,TiDB采用go语言编写。TiDB是一个分布式NewSQL数据库;它支持水平弹性扩展、ACID事务、标准SQL、MySQL语法和MySQL协议,具有数据强一致的高可用特性。TiDB架构中的PD储存了集群的元信息,如key在哪个TiKV节点;PD还负责集群的负载均衡以及数据分片等。PD通过内嵌etcd来支持数据分布和容错;PD采用go语言编写。

go语言能编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言。对Go语言程序进行编译的命令有两种:1、“go build”命令,可以将Go语言程序代码编译成二进制的可执行文件,但该二进制文件需要手动运行;2、“go run”命令,会在编译后直接运行Go语言程序,编译过程中会产生一个临时文件,但不会生成可执行文件。

go语言需要编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言,也就说Go语言程序在运行之前需要通过编译器生成二进制机器码(二进制的可执行文件),随后二进制文件才能在目标机器上运行。

删除map元素的两种方法:1、使用delete()函数从map中删除指定键值对,语法“delete(map, 键名)”;2、重新创建一个新的map对象,可以清空map中的所有元素,语法“var mapname map[keytype]valuetype”。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

드림위버 CS6
시각적 웹 개발 도구

Dreamweaver Mac版
시각적 웹 개발 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경
