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

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

下面这段代码能否通过编译,不能的话原因是什么;如果通过,输出什么。

func main() {
	list := new([]int)
	list = append(list, 1)
	fmt.Println(list)
}
4175 阅读
43 回复
sunshuxing
sunshuxing · #1 · 3年之前
list := new([]int)
*list = append(*list, 1)
fmt.Println(*list)
huadiji
huadiji · #2 · 3年之前

不能通过,new 产生的是指针类型,append要的是值类型

dingweihua
dingweihua · #3 · 3年之前

append函数的定义如下,不能接收指针类型。

func append(slice []Type, elems ...Type) []Type

henry1
henry1 · #4 · 3年之前

ok

feiyang
feiyang · #5 · 3年之前

打卡

brothersam
brothersam · #6 · 3年之前

list := make([]int,0)

euibieur894
euibieur894 · #7 · 3年之前

打卡

_Aiden_
_Aiden_ · #8 · 3年之前

1

felixzxk
felixzxk · #9 · 3年之前

mark

Natsuwau
Natsuwau · #10 · 3年之前

mark

Payne_F
Payne_F · #11 · 3年之前

mark

NovaChaos
NovaChaos · #12 · 3年之前

mk

brothersam
brothersam · #13 · 3年之前

feiyang
feiyang · #14 · 3年之前

new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。

felixzxk
felixzxk · #15 · 3年之前

mark

wzbwzt
wzbwzt · #16 · 3年之前

1

Zuos
Zuos · #17 · 3年之前

mark

Neightly
Neightly · #18 · 3年之前

为什么连着看到*slice的场景? 说实话,当引用func append(slice []Type, elems ...Type) []Type做论据的时候已经输了,因为在builtin里找到的(包括unsafe)都是文档性质的,只是告诉人们是什么和怎么用。它又不是一个真实的函数,既不符合签名规范,也找不到调用栈。 所以这个问题,需要从语义而不是语法的角度分析为什么不允许。 顺便说一下,issues包括proposals里有很多案例,官方团队没有接受并不是说不正确或不能实现,反而是添加到语言规范或者标准库会引入更多的inconsistency。

feiyang
feiyang · #19 · 3年之前
feiyangfeiyang #14 回复

new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。

不能通过编译,new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。

brothersam
brothersam · #20 · 3年之前

list := new([]int) 出来的是一个指针,list = append(list, 1) 加号就可以

NovaChaos
NovaChaos · #21 · 3年之前

mk

summers
summers · #22 · 3年之前

m

hasbug
hasbug · #23 · 3年之前

mark

neil_liu
neil_liu · #24 · 3年之前

mark

huanfengnt
huanfengnt · #25 · 2年之前

cainiaoyige01
cainiaoyige01 · #26 · 2年之前

append只接受[]slice,不接受指针类型的!

flyZ
flyZ · #27 · 2年之前

make

huangyf168
huangyf168 · #28 · 2年之前

make

hasbug
hasbug · #29 · 2年之前

mark

feiyang
feiyang · #30 · 2年之前

new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。

YuPeng
YuPeng · #31 · 2年之前

打卡

YuPeng
YuPeng · #32 · 2年之前

mark

YuPeng
YuPeng · #33 · 2年之前
YuPengYuPeng #31 回复

打卡

发现重复了

hasbug
hasbug · #34 · 2年之前

mark

huangyf168
huangyf168 · #35 · 2年之前

mark

528548004
528548004 · #36 · 2年之前

mark

zhangwei_go
zhangwei_go · #37 · 大约1年之前

func main() { list := new([]int) list = append(list, 1) fmt.Println(list) }

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

mk

brothersam
brothersam · #39 · 大约1年之前

oh

Qmfuser
Qmfuser · #40 · 大约1年之前

mark

BigBigGopher
BigBigGopher · #41 · 12月之前

new只分配内存,并返回指向该类型零值的指针; make用于切片、映射和通道的初始化,并返回该引用类型的非零值。 不能对指针使用append操作,可以使用make初始化之后再用

Qmfuser
Qmfuser · #42 · 12月之前

mark

BigBigGopher
BigBigGopher · #43 · 8月之前

不能通过编译,new([]int)之后的list是一个*[]int类型的指针,不能对指针执行append操作,可以使用make()初始化之后再用,同样的,map和channel建议使用make()或字面量的方式初始化,不要用new()

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