开启掘金成长之旅!这是我参与「掘金日新计划 · 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面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!