Go每日一题(101) 的题目如下

4212 次点击 · 4 赞 ·大约8小时之前 开始浏览   · 来源「Golang来啦」

下面这段代码输出什么?

func main() {
	var a = [5]int{1, 2, 3, 4, 5}
	var r [5]int

	for i, v := range a {
		if i == 0 {
			a[1] = 12
			a[2] = 13
		}
		r[i] = v
	}
	fmt.Println("r = ", r)
	fmt.Println("a = ", a)
}
4212 阅读
49 回复
huhaophp
huhaophp · #1 · 3年之前

r = 1 2 3 4 5 a = 1 12 13 4 5

数组非引用类型

henry1
henry1 · #2 · 3年之前

neil_liu
neil_liu · #3 · 3年之前

mark

gokx
gokx · #4 · 3年之前

mark

Inforleo
Inforleo · #5 · 3年之前

m

eric648320392
eric648320392 · #6 · 3年之前

mark

minQie
minQie · #7 · 3年之前

di

qiaoshuai951123
qiaoshuai951123 · #8 · 3年之前

r 的结果为: 1,2,3,4,5
a的结果为: 1,12,13,4,5

johann1024
johann1024 · #9 · 3年之前

2022-04-26

gonglf
gonglf · #10 · 3年之前

range 表达式是副本参与循环,并且数组非引用类型

halo_young
halo_young · #11 · 3年之前

m

cpipi1024
cpipi1024 · #12 · 3年之前

打卡。range循环副本

Natsuwau
Natsuwau · #13 · 3年之前

mark

goCurrent
goCurrent · #14 · 3年之前

a如果是slice就不一样。形如b := a,如果a是slice,则b为引用,如果a是数组,b是整个复制

NovaChaos
NovaChaos · #15 · 3年之前

mk

_Aiden_
_Aiden_ · #16 · 3年之前

这个对3天前那个题目做了扩展解释

brothersam
brothersam · #17 · 3年之前

【1 2 3 4 5 】【1 12 13 4 5】遍历的是快照

mingtop
mingtop · #18 · 3年之前

range 副本操作。

hasbug
hasbug · #19 · 3年之前

mark

a406299736
a406299736 · #20 · 3年之前

mark

wzbwzt
wzbwzt · #21 · 3年之前

1

toywish
toywish · #22 · 3年之前

1

Seek
Seek · #23 · 3年之前

mark

QRQRQRqrqr
QRQRQRqrqr · #24 · 3年之前

func main() { var a = [5]int{1, 2, 3, 4, 5} var r [5]int

for i, v := range a {
    if i == 0 {
        a[1] = 12
        a[2] = 13
    }
    r[i] = v
}
fmt.Println("r = ", r)
fmt.Println("a = ", a)

} r = [1 2 3 4 5] a = [1 12 13 4 5] range 是 a 的副本 不是a本身 func main() { var a = [5]int{1, 2, 3, 4, 5} var r [5]int

for i, v := range &a {
    if i == 0 {
        a[1] = 12
        a[2] = 13
    }
    r[i] = v
}
fmt.Println("r = ", r)
fmt.Println("a = ", a)

} r = [1 12 13 4 5] a = [1 12 13 4 5]

a406299736
a406299736 · #25 · 2年之前

111111

hasbug
hasbug · #26 · 2年之前

mark

wzbwzt
wzbwzt · #27 · 2年之前

1

huangyf168
huangyf168 · #28 · 2年之前

mark

jatshw
jatshw · #29 · 2年之前

mark

Yt3134
Yt3134 · #30 · 2年之前

mark

euibieur894
euibieur894 · #31 · 2年之前

打卡

cainiaoyige01
cainiaoyige01 · #32 · 2年之前

range 中遍历数据是一个数组的一个副本!如果想修改立即生效就赋一个地址进去!

hasbug
hasbug · #33 · 2年之前

mark

flyZ
flyZ · #34 · 2年之前

mark

YuPeng
YuPeng · #35 · 2年之前

打卡

feiyang
feiyang · #36 · 2年之前

range 表达式是副本参与循环,就是说例子中参与循环的是 a 的副本,而不是真正的 a。

cllgeek
cllgeek · #37 · 2年之前

打卡

528548004
528548004 · #38 · 2年之前

mark

YuPeng
YuPeng · #39 · 2年之前

mark

1174en
1174en · #40 · 2年之前

m

hasbug
hasbug · #41 · 2年之前

mark

Zuos
Zuos · #42 · 2年之前

m

1174en
1174en · #43 · 大约1年之前

m

zhangwei_go
zhangwei_go · #44 · 大约1年之前
//1,2,3,4,5
fmt.Println("r = ", r)
//1,12,13,4,15
fmt.Println("a = ", a)  

range知识点考察

BigBigGopher
BigBigGopher · #45 · 大约1年之前

mark

zhupp
zhupp · #46 · 大约1年之前

m

1174en
1174en · #47 · 大约1年之前

m

amocea
amocea · #48 · 大约1年之前

本来具备有疑惑:为什么 for range 循环拷贝的是 a 的副本,那什么修改a时会生效呢,自己认为 a 就是已经拷贝后的副本 答案:for range 拷贝的副本没有显式调用,也也就是其在 i,v 和遍历次数上做了一定的出口限制。所以导致 r 仍然是原值。 尽管其在内部对 a 进行了修改,但不会遍历到那些被修改后的数据。

PenS
PenS · #49 · 大约1个月之前

mark

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传