每次学习并整理一个Golang的知识点,每天进步一点点。今天来学习下var的一个知识点🤔。

代码片段

观察如下代码片段,判断能否编译通过;如果可以,写出输出结果?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package main

import "fmt"

var (
	num       = 60
	doubleNum := num * 2
)

func main() {
	fmt.Println(num, doubleNum)
}

思考后看答案

思考后看答案


答疑解惑

编译不通过。

改为doubleNum = num * 2后编译通过,输出结果为:60 120

你做对了吗?😊

这道题的主要知识点是变量声明的简短模式。但这种使用方式有所限制:

  • 必须使用显示初始化;
  • 不能提供数据类型,编译器会自动推导;
  • 只能在函数内部使用简短模式;

拓展阅读

Go中对于声明变量时需要进行初始化的场景,var关键字可以保留,但不再是必要的元素,如下所示:

1
2
3
var v1 int =0   // 使用方式1
var v2 = 0      // 使用方式2,编译器可以自动推导出v2的类型
v3 := 0         // 使用方式3,编译器可以自动推导出v3的类型

以上三种用法的效果是一样的。与第一种用法相比,第三种用法需要输入的字符数大大减少,是懒程序员和聪明程序员的最佳选择;这里Go语言引入了一个C和C++中没有的符号(冒号和等号的组合:=),用于明确表达同时进行变量声明和初始化的工作。 当然,出现在:=左边的变量不应该是声明过的,否则会导致编译错误,比如下面这个写法:

1
2
var i int
i := 2

会导致类似如下的编译错误:

no new variables on left side of :=

下期提问

观察如下代码片段,判断能否编译通过;如果可以,写出输出结果?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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爱月”或扫描下方二维码:

xujpxm_qrcode_gh