浅谈Go与习题(十八)

92 阅读2分钟

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

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

变量隐藏

观察下列代码,判断最后一个Println输出结果是什么?为什么?

func main() {
     x := 1
     fmt.Println(x)
     {
         fmt.Println(x)
         i,x := 2,2
         fmt.Println(i,x)
     }
     fmt.Println(x)  // 输出结果是什么?
}

参考答案:输出1,这里考察变量隐藏的知识点,使用:=短声明符号的时候,左边有多个变量,至少需要保证有一个变量是新声明的,如果出现作用域之后,就会导致变量x隐藏的问题,所以最后输出的值不是2而是1,这里额外提一下包隐藏,观察下列代码:

package main

import "fmt"

func Debugf(fmt string, args ...interface{}) {
  fmt.Printf(fmt, args...)
}

这个函数完成的功能是,从fmt包中调用Printf并将变量fmt传入输出,函数声明中的fmt字符串变量隐藏了原先的fmt包,所以编译器会报错,识别不出Printf方法,需要将变量名修改才可以重新获得对fmt包的访问

结构体赋值

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

type foo struct {
    YYQQ int
}

func main() {
    var f foo
    f.YYQQ, tmp := 14,5
}

参考答案:不能通过编译,报错信息expected identifier on left side of :=,赋值:= 操作符不能用于结构体字段赋值,正确赋值语法如下:

var structVar StructType 
structVar.Field1 = Field1Value 
structVar.Field2 = Field2Value 
structVar.Field3 = Field3Value

结构体访问控制

观察下列代码,判断输出内容是什么?

type People struct {
     name string `json:"name"`
}
func main() {
     js := `{
         "name":"YYQQ"
     }`
     var p People
     err := json.Unmarshal([]byte(js), &p)
     if err != nil {
        fmt.Println("err: ", err)
        return
    }
    fmt.Println(p)
}

参考答案:输出{},这里考察结构体访问控制的知识点,由于People结构成员name的首字母是小写,导致json包中不能访问,所以输出为空结构体,修改代码如下:

type People struct {
     Name string `json:"name"`
}

总结

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