- 下面2段代码输出什么:
func Test1(t *testing.T) {
s := make([]int, 5)
s = append(s,1,2,3)
t.Log(s)
}
func Test2(t *testing.T) {
s := make([]int,0)
s = append(s, 1,2,3,4)
t.Log(s)
}
- 下面这段代码有什么缺陷:
func funcMui(x, y int) (sum int, error) {
return x + y, nil
}
new()
与make()
的区别
参考解析
第一个问题:
$ go test -v
=== RUN Test1
--- PASS: Test1 (0.00s)
demo1_test.go:10: [0 0 0 0 0 1 2 3]
=== RUN Test2
--- PASS: Test2 (0.00s)
demo1_test.go:16: [1 2 3 4]
PASS
ok _/Users/finup/finupdata/go-projects/go-interview/chapter03 0.006s
解析: 这道题考的是使用append
向slice
添加元素, 第一段代码常见的错误是[1 2 3]
, 需要注意
第二个问题:
参考答案: 第二个返回值没有命名
参考解析:
在函数中有多个返回值时, 只要有一个返回值有命名, 其他的也必须命名. 如果有多个返回值必须加上括号()
;
如果只有一个返回值且命名也必须加上括号()
. 这里的第一个返回值有命名sum
, 第二个没有命名, 所以错误.
第三个问题:
参考答案:
new(T)
和make(T, args)
是Go 语言内建函数,用来分配内存,但使用的类型不同.
new(T)
会为T
类型的新值分配已置零的内存空间,并返回地址(指针), 即类型为*T
的值.换句话说就是,返回一个指针,
该指针指向新分配的,类型为T
的零值.适用于值类型, 比如数组, 结构体等
make(T,args)
返回初始化之后的T
类型的值,这个值并不是T
类型的零值,也不是指针*T
,是经过初始化之后的T
的引用.
make()
适用于slice map 和channel
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付