当前位置:网站首页>一道golang中关于for range常见坑的面试题
一道golang中关于for range常见坑的面试题
2022-07-23 20:41:00 【youngqqcn】
以下代码运行,会输出什么?
package main
import "fmt"
type student struct {
Name string
Age int
}
func pase_student() {
m := make(map[string]*student)
stus := []student{
{
Name: "A", Age: 1},
{
Name: "B", Age: 2},
{
Name: "C", Age: 3},
}
for _, stu := range stus {
m[stu.Name] = &stu
}
for k, v := range m {
fmt.Printf("%v,%v,%v\n", k, v.Name, v.Age)
}
}
func main() {
pase_student()
}
请思考,答案在文末
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
答案
A,C,3
B,C,3
C,C,3
为什么?
因为在golang的for range中,临时变量stu会被复用,然后将新的值复制进去,而不会另开辟空间。所以题目中m[stu.Name] = &stu,会导致stu中的值会是最后一次复制进去的值,即stus最后一个值。
我们可以写个测试程序,验证这个“坑”:
func main() {
a := []int{
1, 2, 3, 4}
for x, n := range a {
fmt.Printf("%d: %d\n", x, n)
fmt.Printf("%p\n", &n)
}
}
输出
0: 1
0xc0000160c8
1: 2
0xc0000160c8
2: 3
0xc0000160c8
3: 4
0xc0000160c8
可以看到,每次&n都是固定的
如何修改?
第1种,使用值,而不是指针。可以将 m := make(map[string]*student) 改成 m := make(map[string]student) , 完整代码如下:
func pase_student() {
m := make(map[string]student)
stus := []student{
{
Name: "A", Age: 1},
{
Name: "B", Age: 2},
{
Name: "C", Age: 3},
}
for _, stu := range stus {
m[stu.Name] = stu
}
for k, v := range m {
fmt.Printf("%v,%v,%v\n", k, v.Name, v.Age)
}
}
第2种,不用for range改用经典的for
func pase_student() {
m := make(map[string]student)
stus := []student{
{
Name: "A", Age: 1},
{
Name: "B", Age: 2},
{
Name: "C", Age: 3},
}
for i := 0; i < len(stus); i++ {
m[stus[i].Name] = stus[i]
}
for k, v := range m {
fmt.Printf("%v,%v,%v\n", k, v.Name, v.Age)
}
}
其他方式也可以。
所以,在实际项目开发中,用到for range时赋值时一定要注意这个“坑”
边栏推荐
猜你喜欢

Chapter 3 business function development (creating clues)

使用TinkerPop框架对GDB增删改查

Read the five flow indicators of R & D efficiency insight

【攻防世界WEB】难度四星12分进阶题:Confusion1

高数下|三重积分的计算2|高数叔|手写笔记

高数下|二重积分的计算2|高数叔|手写笔记

深入浅出边缘云 | 1. 概述

Jetson nano recording stepping on the pit (it will definitely solve your problem)

MySQL(3)

CDR插件开发之Addon插件002 - 用1分钟编写一个可双击运行的EXE程序
随机推荐
分布式事务方案:最大努力通知方案
Major upgrade of openim - group chat reading diffusion model release group management function upgrade
ES6特性:Promise(自定义封装)
最小生成树:Prim
美团大脑百亿级知识图谱的构建及应用进展
Shell command and operation principle
【攻防世界WEB】难度四星12分进阶题:Confusion1
支付产品及其使用场景
Cesium 核心类Viewer-查看器详解
Solve the problem that the user clicks quickly and repeats the request within 1 second
Jetson nano recording stepping on the pit (it will definitely solve your problem)
Failed to introspect Class FeignClientFactoryBean 异常排查
LU_ASR01语音模块使用
Microservice architecture vs single service architecture [what can Huawei cloud service do in the microservice mode]
利用ENVI对TROPOMI(哨兵5P)数据预处理
"Pulse" to the future! Huawei cloud Mrs helps smooth migration to the cloud
1309_STM32F103上增加GPIO的翻转并用FreeRTOS调度测试
选择大于努力!贵阳校区小哥哥0基础成功转行软件测试收获12K!
深度学习-NLP经典论文、课程、论文等资源整理分享
实践数据湖iceberg 第三十七课 kakfa写入iceberg的 icberg表的 enfource ,not enfource测试