浅谈Go与习题(十五)

80 阅读2分钟

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

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

变量使用

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

package main

 var YYQQ int 

 func main() {  
     var one int   
     two := 5      
     var three int 
     three = 7

    func(unused string) {
        fmt.Println("Unused arg. No compile error")
    }("what?")
}

参考答案:不能通过编译,这里主要考察对申明的变量却没有使用,这样会导致程序编译出错,但有些特殊情况,函数中申明的变量也是必须要使用,全局变量YYQQ可以没被使用,或者函数的参数也可以没被使用,需要注意的是,如果给未使用的变量分配了一个新值,程序代码还是不通过编译。这就需要在其他地方使用这个变量,才能让编译器通过,可以有以下几种操作:

func main() {
     var one int
     _ = one //下划线接收,忽略变量

     two := 2
     fmt.Println(two) //输出变量

     var three int
     three = 3
     one = three //使用变量

     var four int
     four = four //使用变量
}

或者可以使用注释或者删除没有使用的变量

String() 方法

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

type ConfigOne struct {
     YYQQ string
 }

 func (c *ConfigOne) String() string {
     return fmt.Sprintf("print: %v", c)
 }

 func main() {
    c := &ConfigOne{}
    c.String()
}

参考答案:程序出错,因为结构体类型实现了 String() 方法,当使用Sprintf格式化输出时会自动使用 String() 方法,那么上述代码中,是在Stirng()方法中调用格式化输出,又会上面这段代码是在该类型的 String() 方法内使用格式化输出,导致递归调用,最后内存不足爆栈,程序出错

runtime: goroutine stack exceeds 1000000000-byte limit
runtime: sp=0x140208003d0 stack=[0x14020800000, 0x14040800000]

for-range 切片添加

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

func main() {
     var a = []int{1, 2, 3, 4, 5}
     var r = make([]int, 0)

     for i, v := range a {
         if i == 0 {
             a = append(a, 6, 7)
         }

        r = append(r, v)
    }

    fmt.Println(r)
}

参考答案:输出1,2,3,4,5,因为range遍历的是a的副本,一开始a的切片长度为5,所以只会循环五次,也就是切片r只会添加切片a底层数组的前五个元素

总结

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