开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:变量作用域课后习题】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/625/detail/9613
变量作用域课后习题
内容介绍::
一、习题一
二、习题二
一、习题一
1、思考:下面的代码输出什么内容?
package main
import (
_ "encoding/json"
"fmt"
)
var name = "tom”
//全局变量
func test
0
1()
{
fmt.Print
l
n(name)
//t
om
tom
}
func test
0
2()
{
//编译器采用就近原则
name := "jack"
fmt.Print
l
n(name
)
//
jack
}
func main()
{
fmt.Print
l
n(name)
//
tom
t
est
0
1(
)
/ /tom
t
est
0
2()
//
jack
t
est
0
1()
//tom
}
2、输出结果为:
tom tom jack tom
3、代码分析:
先从 func main 看起,这里有个 main 函数,main 函数输出一个 name,但 name在函数内部没有定义,在外面定义了全局变量,这个变量的首字母是小写的,所以在本包都是可以被使用的。fmt.Println(name) 会输出 tom,又调用了 test01,test01是一个函数又用到了 name,这个 name 在本函数是没有定义的。会直接使用外面的全局变量,fmt.Println(name)也输出 tom,在 test02里定义了一个name,局部变量有个 name,全局变量也有个 name 不会报错,因为在局部变量和全局变量相同时编译器会采用一个就近原则。以 name := "jack"为准,fmt.Println(name) 会输出jack。紧接着又输出 test01,test01又重新回调一次,又会再次输出 tom。
如果把 name:=“jack”中“:”去掉了,代码不会报错,但是输出内容会改变。没有:相当于把jack重新赋给全局变量,这时候 name 与全局变量是同一个,当调用完 test01再输出的时候,也会输出jack,输出的结果为:ton,tom,jack,jack。
二、习题二
1、思考:下面的代码输出什么内容?
var Age int = 20
//
ok
Name := "tom"
//
var Name string Name = "tom"
func main() {
fmt.Println("name",Name)
}
2、输出报错
var Name string Name = "tom"错误的原因是Name :=”tom”等价var Name string Name = "tom"赋值语句不能在函数体外,所以报错。
3、代码分析:
var Age int = 20是没有错误的,但是 Name := "tom"这句话是有错误,前面一句是在定义的时候就同时赋了值,但 Name := "tom"这句话等价于两句话,编译器会报错等价于 var Name string Name = "tom",因为定义是在函数外定义的,不可以有赋值语句, Name = "tom"是执行语句,需要在函数体内才能进行,所以Name := "tom会报错。会显示 syntax error: non-declaration statement outside function body 就是这里面有一个不能放在函数体外的语句。