浅谈Go与习题(十三)

293 阅读3分钟

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

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

函数声明

下列选项中,关于函数声明正确的是?

  • A. func f(a, b int) (value int, err error)
  • B. func f(a int, b int) (value int, err error)
  • C. func f(a, b int) (value int, error)
  • D. func f(a int, b int) (int, int, error)

参考答案;选择ABD,参数返回值其中有一个是变量名形式,另一个就不能省略,函数声明告诉了编译器函数的名称,返回类型和参数

切片初始化

下列选项中,关于整型切片初始化正确的是?

  • A. s := make([]int)
  • B. s := make([]int, 0)
  • C. s := make([]int, 5, 10)
  • D. s := []int{1, 2, 3, 4, 5}

参考答案:选择BCD,切片声明的格式为var slice1 []type = make([]type, len),这里需要指定切片的长度,len是数组的长度并且也是切片的初始长度,其次也可以指定容量,其中 capacity 为可选参数,也就是C选项中的第三个参数

常量寻址

观察下列代码,判断是否能通过编译?

const i = 233
var j = 333

func main() {
    fmt.Println(&j, j)
    fmt.Println(&i, i)
}

参考答案:不能通过编译,提示的错误为invalid operation: cannot take address of i (untyped int constant 100)compiler[UnaddressableOperand],因为常量不是在运行时期分配内存,而是通常会被编译器在预处理阶段直接展开,作为指令数据使用,所以常量无法寻址。此外赋予常量的初始化表达式必须是在编译期间可以求出值来的

函数返回值

观察下列代码,判断是否能通过编译?为什么?

func GetValue(m map[int]string, id int) (string, bool) {

     if _, exist := m[id]; exist {
         return "exist", true
     }
     return nil, false
 }
 func main() {
     intmap := map[int]string{
        1: "W",
        2: "E",
        3: "R",
    }

    v, err := GetValue(intmap, 3)
    fmt.Println(v, err)
}

参考答案:不能通过,提示的错误为cannot use nil as string value in return statementcompiler[IncompatibleAssign] ,nil可以用作 interface、function、pointer、map、slice 和 channel的空值,所以不能将nil返回给string类型,需要返回" "字符串

for 遍历

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

func main() {
    x := []string{"w", "e", "r"}
    for v := range x {
        fmt.Print(v)
    }
}

参考答案:输出0,1,2,这里考察对for-range的使用方法,for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环,相关写法如下:

for key, value := range oldMap {
    newMap[key] = value
}

key和value可以省略,只读key的值可以写成下面这样

for key := range oldMap

只读value的值可以下成下面这样

for _, value := range oldMap

总结

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