Go 学习小册:go.jun.one
Github
  • 首页
  • Go 面试题
    • Untitled
    • 数组与切片有什么异同
    • 41-50
    • 4-5月
    • Go 进阶实战 100 题
    • Go 并发编程
  • 跟着例子学习Go
    • 基础部分
      • 12. 函数
      • 13. 多返回值函数
      • 14.可变参函数
      • 15. 闭包
  • 我的社区贡献和开源项目
  • Struct 结构体
    • 自定义类型
    • 结构体
    • 匿名结构体
    • 接口 interface
  • gin
    • Gin 项目初始化
  • 并发
    • 并发安全和锁
    • 一文搞定 Go 并发的实现原理:goroutine
  • 常用代码块
    • gerr
  • Go Web 开发进阶
    • MySQL 的连接和初始化
    • MySQL Register 源码解读
    • Go 原生操作 MySQL CRUD
  • go-redis的基本使用
由 GitBook 提供支持
在本页
  • 41. 下面代码中 A B 两处应该怎么修改才能顺利编译?
  • 42. 下面代码输出什么?
  • 43 下面代码中,x 已声明,y 没有声明,判断每条语句的对错。
  • 44. 下面代码输出什么?
  • 45. 下面代码输出什么?
  • 46. f1()、f2()、f3() 函数分别返回什么?
  • 47. 下面代码段输出什么?
  • 48. 下面这段代码正确的输出是什么?
  • 49.
  • 50. 下面的两个切片声明中有什么区别?哪个更可取?

这有帮助吗?

在GitHub上编辑
  1. Go 面试题

41-50

41. 下面代码中 A B 两处应该怎么修改才能顺利编译?

func main() {
    var m map[string]int        //A
    m["a"] = 1
    if v := m["b"]; v != nil {  //B
        fmt.Println(v)
    }
}
答案

应该修改成:

func main() {
    m = make(map[string]int)
    m["a"] = 1
    if v, ok := m["b"]; ok == true {
         fmt.Println(v)   
    }
}

解析:在 A 处,只声明了map m ,并没有分配内存空间,不能直接赋值,需要使用 make(),都提倡使用 make() 或者字面量的方式直接初始化 map。

B 处,v,k := m["b"] 当 key 为 b 的元素不存在的时候,v 会返回值类型对应的零值,k 返回 false。

42. 下面代码输出什么?

type A interface {
    ShowA() int
}

type B interface {
    ShowB() int
}

type Work struct {
    i int
}

func (w Work) ShowA() int {
    return w.i + 10
}

func (w Work) ShowB() int {
    return w.i + 20
}

func main() {
    c := Work{3}
    var a A = c
    var b B = c
    fmt.Println(a.ShowB())
    fmt.Println(b.ShowA())
}
  • A. 23 13

  • B. compilation error

答案

答:B

解析:

知识点:接口的静态类型。

a、b 具有相同的动态类型和动态值,分别是结构体 work 和 {3};a 的静态类型是 A,b 的静态类型是 B,接口 A 不包括方法 ShowB(),接口 B 也不包括方法 ShowA(),编译报错。看下编译错误:

a.ShowB undefined (type A has no field or method ShowB)
b.ShowA undefined (type B has no field or method ShowA)

43 下面代码中,x 已声明,y 没有声明,判断每条语句的对错。

1. x, _ := f() x 
2. x, _ = f() y
3. x, y := f() y
4. x, y = f() x
答案

答:错、对、对、错

知识点:变量的声明。

解析:

1.错,x 已经声明,不能使用 :=;2.对;3.对,当多值赋值时,:= 左边的变量无论声明与否都可以;4.错,y 没有声明。

44. 下面代码输出什么?

func increaseA() int {
    var i int
    defer func() {
        i++
    }()
    return i
}

func increaseB() (r int) {
    defer func() {
        r++
    }()
    return r
}

func main() {
    fmt.Println(increaseA())
    fmt.Println(increaseB())
}
答案

答:0 1

解析:

知识点:defer、返回值。

先 return 后 defer defer的时候,会缓存当前变量的值。

45. 下面代码输出什么?

type A interface {
    ShowA() int
}

type B interface {
    ShowB() int
}

type Work struct {
    i int
}

func (w Work) ShowA() int {
    return w.i + 10
}

func (w Work) ShowB() int {
    return w.i + 20
}

func main() {
    var a A = Work{3}
    s := a.(Work)
    fmt.Println(s.ShowA())
    fmt.Println(s.ShowB())
}

A

46. f1()、f2()、f3() 函数分别返回什么?

func f1() (r int) {
    defer func() {
        r++
    }()
    return 0
}

func f2() (r int) {
    t := 5
    defer func() {
        t = t + 5
    }()
    return t
}

func f3() (r int) {
    defer func(r int) {
        r = r + 5
    }(r)
    return 1
}

1 5 1

47. 下面代码段输出什么?

type Person struct {
    age int
}

func main() {
    person := &Person{28}

    // 1. 
    defer fmt.Println(person.age)

    // 2.
    defer func(p *Person) {
        fmt.Println(p.age)
    }(person)  

    // 3.
    defer func() {
        fmt.Println(person.age)
    }()

    person.age = 29
}

29 29 28

48. 下面这段代码正确的输出是什么?

func f() {
    defer fmt.Println("D")
    fmt.Println("F")
}

func main() {
    f()
    fmt.Println("M")
}

  • A. F M D

  • B. D F M

  • C. F D M

答:C

解析:

被调用函数里的 defer 语句在返回之前就会被执行,所以输出顺序是 F D M。

49.

type Person struct {
    age int
}

func main() {
    person := &Person{28}

    // 1.
    defer fmt.Println(person.age)

    // 2.
    defer func(p *Person) {
        fmt.Println(p.age)
    }(person)

    // 3.
    defer func() {
        fmt.Println(person.age)
    }()

    person = &Person{29}
}

50. 下面的两个切片声明中有什么区别?哪个更可取?

A. var a []int
B. a := []int{}

解析:

A 声明的是 nil 切片;B 声明的是长度和容量都为 0 的空切片。第一种切片声明不会分配内存,优先选择。

上一页数组与切片有什么异同下一页4-5月

最后更新于3年前

这有帮助吗?