七叶笔记 » golang编程 » Go学习每日一问(4)-var

Go学习每日一问(4)-var

每次学习并整理一个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爱月”。

相关文章