浅谈Go与习题(四)

104 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情

今天来学习下Go常见的习题问题(四),也是面试中可能会遇到的,让我们来一起学习吧~

类型断言

观察下列代码,是否能通过编译?如果可以,输出是什么?

func GetValue() int {
     return 1
 }

 func main() {
     i := GetValue()
     switch i.(type) {
     case int:
         println("int")
     case string:
        println("string")
     case interface{}:
        println("interface")
     default:
        println("unknown")
    }
}

参考答案:上述代码不能通过编译,因为i.(type)类型选择的语法形式中,i只能是接口类型,type是固定关键字,只有接口才能使用类型选择,修改代码如下:

func GetValue() interface{} {
     return 12
 }

 func main() {
     i := GetValue()
     switch i.(type) {
     case int:
         println("int")
     case string:
        println("string")
     case interface{}:
        println("interface")
     default:
        println("unknown")
    }
}

channel的使用

下列选项中,关于channel的操作正确的是()

  • A. var ch chan int
  • B. ch := make(chan int)
  • C. <- ch
  • D. ch <-

参考答案:选择ABC, 前两项都是关于channel的声明,第三个是读取channel,第四个往channel里面写数据,必须要有数据才行,所以第四个选项错误,需要改成ch <- "value"

map的零值

观察下列代码,输出结果是什么?

type person struct {  
    name string
}

func main() {  
    var m map[person]int
    p := person{"YYQQ"}
    fmt.Println(m[p])
}

参考答案: 输出结果为0,因为map中输出一个不存在值,会返回元素的零值,上述代码中m的类型为map[string]int,因为p不存在,所以输出int类型的零值,即0

不同类型相加

观察下列代码,能否通过编译?如果可以,输出的结果是什么?

func main() {  
    a := 12
    b := 3.4
    fmt.Println(a + b)
}

参考答案:不能通过编译,因为a的类型是int,b的类型是float,两个不同类型的值是不能相加

切片截取

观察下列代码,输出的结果是什么?

package main

import (  
    "fmt"
)

func main() {  
    a := [5]int{1, 2, 3, 4, 5}
    t := a[3:4:4]
    fmt.Println(t[0])
}

参考答案:输出结果为4

操作符 [i:j] ,在原来切片的基础上创建新的切片,从索引 i,到索引 j 结束,截取已有数组(切片)的任意部分,新切片的值包含原数组(切片)的 i 索引的值,但是不包含 j 索引的值。

i 如果省略,默认是 0,j 如果省略,默认是原数组(切片)的长度,i、j 都不能超过这个长度值,例如a[:2],a[1:]

假如底层数组的大小为 k,截取之后获得的切片的长度和容量的计算方法:长度:j-i,容量:k-i

重点: 截取操作符还可以有第三个参数,形如 [i:j:k],第三个参数 k 用来限制新切片的容量,但不能超过原数组(切片)的底层数组大小,截取获得的切片的长度和容量分别是:j-i、k-i。

上述代码中,截取后的新切片为[4],长度和容量都是1

数组的比较

观察下列代码,输出的结果是什么?

func main(){
    a := [2]int{5, 6}
    b := [3]int{5, 6}
    if a == b {
        fmt.Println("equal")
    } else {
        fmt.Println("not equal")
    }
}

参考答案:上述代码不能通过编译,因为go中的数组是值类型可以比较,并且数组的长度、类型也是数组类型的组成部分,因为数组a和b的长度不一致,不是相同的类型,所以不能通过编译

总结

今天浅谈了Go的习题(四),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!