Go面试题6

Posted by     "" on Wednesday, December 18, 2019

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
}

答案解析

  1. 参考答案及解析: AC. & 取址运算符,* 指针解引用.

  2. 参考答案及解析: 编译不能通过, 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)

  3. 参考答案及解析:

[7 8 9]
[7 8 9]
[1 8 9]

因为append 导致底层数组重新分配内存了,apa 这个slice的底层数组和外面的不是一个, 并没有改变外面的.

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

使用微信扫描二维码完成支付