每次学习并整理一个Golang的知识点,每天进步一点点。今天来学习下 var 的一个知识点。
代码片段
观察如下代码片段,判断能否编译通过;如果可以,写出输出结果?
package main
import "fmt"
var (
num = 60
doubleNum := num * 2
)
func main() {
fmt.Println(num, doubleNum)
}
思考后看答案
答疑解惑
编译不通过。
改为 doubleNum = num * 2 后编译通过,输出结果为:60 120
你做对了吗?
这道题的主要知识点是变量声明的简短模式。但这种使用方式有所限制:
- 必须使用显示初始化;
- 不能提供数据类型,编译器会自动推导;
- 只能在函数内部使用简短模式;
拓展阅读
Go 中对于声明变量时需要进行初始化的场景,var关键字可以保留,但不再是必要的元素,如下所示:
var v1 int =0 // 使用方式1
var v2 = 0 // 使用方式2,编译器可以自动推导出v2的类型
v3 := 0 // 使用方式3,编译器可以自动推导出v3的类型
以上三种用法的效果是一样的。与第一种用法相比,第三种用法需要输入的字符数大大减少,是懒程序员和聪明程序员的最佳选择;这里Go语言引入了一个C和C++中没有的符号(冒号和等号的组合:=),用于明确表达同时进行变量声明和初始化的工作。 当然,出现在:=左边的变量不应该是声明过的,否则会导致编译错误,比如下面这个写法:
var i int
i := 2
会导致类似如下的编译错误:
会导致类似如下的编译错误:
下期提问
观察如下代码片段,判断能否编译通过;如果可以,写出输出结果?
package main
import (
"fmt"
)
type s struct {
name string
age int
}
type m struct {
age int
dict map[string]string
}
func main() {
s1 := s{"xujpxm", 18}
s2 := s{"xujpxm", 18}
if s1 == s2 {
fmt.Println("t1 == t2")
} else {
fmt.Println("s1, s2 不相等")
}
m1 := m{18, map[string]string{"name": "xujpxm"}}
m2 := m{18, map[string]string{"name": "xujpxm"}}
if m1 == m2 {
fmt.Println("m1 == m2")
} else {
fmt.Println("m1, m2不相等")
}
fmt.Println(m2.dict)
}
答案及解析将在下期文章中给出,欢迎大家在评论区留言,独乐乐不如众乐乐,交流学习,互相进步。
欢迎转发和评论。更多优质原创文章,欢迎关注微信公众号“IYue爱月”。