Go面试题6
1: 通过指针变量p
访问其成员变量name
, 有哪几种方式?
- A.
p.name
- B.
(&p).name
- C.
(*p).name
- D.
p->name
2: 下面这段代码能否通过编译? 如果通过, 输出什么?
package main
import "fmt"
type MyInt1 int
type MyInt2 = int
func main() {
var i int = 0
var i1 MyInt1 = i
var i2 MyInt2 = i
fmt.Println(i1, i2)
}
3: 下面这段代码输出什么?
package main
import "fmt"
func main() {
a := []int{7,8,9}
fmt.Printf("%+v\n",a)
ap(a)
fmt.Printf("%+v\n", a)
app(a)
fmt.Printf("%+v\n",a)
}
func ap(a []int) {
a = append(a, 10)
}
func app(a []int) {
a[0] = 1
}
答案解析
-
参考答案及解析:
AC
.&
取址运算符,*
指针解引用. -
参考答案及解析: 编译不能通过,
cannot use i (type int) as type MyInt1 in assignment
这道题考的是类型别名与类型定义的区别. 第五行代码基于类型int
创建了新类型MyInt1
, 第六行代码是创建了int
的类型别名MyInt2
,注意类型别名的定义是=
.所以 第10行代码相当于是将int
类型的变量赋值给了MyInt1
类型的变量, Go是强类型语言, 编译当然不通过; 而MyInt2
只是int
的别名,本质上上还是int
,可以赋值. 第10行代码的复制可以使用强类型转化var i1 MyInt1 = MyInt(i)
-
参考答案及解析:
[7 8 9]
[7 8 9]
[1 8 9]
因为append
导致底层数组重新分配内存了,ap
中a
这个slice
的底层数组和外面的不是一个, 并没有改变外面的.
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付