Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。在数学概念中,变量表示没有固定值且可改变的数。但从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存。

声明变量的一般形式是使用 var 关键字:

var name type

其中,var 是声明变量的关键字,name 是变量名,type 是变量的类型。
需要注意的是,Go语言和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。这样做的好处就是可以避免像C语言中那样含糊不清的声明形式,例如:int* a, b; 。其中只有 a 是指针而 b 不是。如果你想要这两个变量都是指针,则需要将它们分开书写。而在 Go 中,则可以和轻松地将它们都声明为指针类型:

var a, b *int

声明变量有几种形式:
正常格式:

var 变量名 变量类型

批量格式

var (
    a int
    b string
    c []float32
    d float64
    ...
)

简短格式:

名字 := 表达式
package main

import "fmt"

func main() {
	//变量测试
	//小块内存 可以改变,不可以改变的是常量
	// var 变量名 类型
	var num1 int
	num1 = 30
	fmt.Printf("num1 = %d\n", num1)

	var num2 int = 15
	fmt.Printf("num2 = %d\n", num2)
	// 虽然go语言是静态余语言但是支持类型的自动判断
	var num3 = 30
	fmt.Printf("num3 = %d\n", num3)
	fmt.Print("var test")
	// 使用类型腿短 := ,这种方式只能用于函数体内,不能用于全局变量的盛行声明
	num4 := 45
	fmt.Printf("type = [%T]num4 = [%d]\n", num4, num4)

	// 变量集合声明
	var (
		studentName = "xiaoming"
		teacherName = "jianguo"
		studentAge  = 18
		teacherAge  = 28
	)
	fmt.Printf("student name = [%s] age = [%d], Teacher name = [%s] age = [%d]\n",
		studentName, studentAge, teacherName, teacherAge)

}
package main

import "fmt"

func main() {
	var num int
	num = 100
	fmt.Printf("num = %d &"+
		" = %p\n", num, &num)

	//	常量的定义
	//	常量尽量都使用大写的定义,定义之后不允许修改
	const PI = 3.14
	const PATH string = "http:www.baidu.com"
	fmt.Println(PATH)
	//	定义一组常量
	//	变量的集合
	const C1, C2, C3 = 100, 3, "haha"
	const (
		NAME     = "xiaoming"
		LINKMODE = 1
	)
	// 一组常量,如果某个常量没有给初始值,就会默认和上一个常量保持一致的值
	const (
		a int = 100
		b
		c string = "ruby"
		d
		e
	)
	fmt.Printf("type = %T, b = [%d]\n", a, a)
	fmt.Printf("type = %T, b = %d\n", b, b)
	fmt.Printf("type = %T, b = %s\n", d, d)
	fmt.Printf("type = %T, b = %s\n", e, e)
}

特殊的常量 iota

package main

import "fmt"

func main() {
	// iota 特殊常量,可以被编译器自动修改的常量,每当定义一个const, iota会自动清零
	// 在同一个变量集合中,iota随着变量的定义一直递增,直到遇到下一个const在清零
	const (
		a = iota
		b = iota
		c = iota
	)
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)

	const (
		e = iota
		f // 默认和上一行一致
		g = iota
	)
	fmt.Println(e)
	fmt.Println(f)
	fmt.Println(g)
	//	枚举实现
	const (
		MALE = iota
		FEMALE
		UNKNOWM
	)
	fmt.Println(MALE, FEMALE, UNKNOWM)

}
package main

import "fmt"

func f1(f func()) {
	fmt.Println("this is f1")
	f()
}

func f2(x, y int) {
	fmt.Println("this is f2")
	fmt.Print(x + y)
}

func f3(f func(int, int), x, y int) func() {
	tmp := func() {
		fmt.Println("hello")
		f(x, y)
	}

	return tmp
}

func main() {
	//基本的数据类型
	//	1.布尔类型
	//	2.数值类型

	//	3.字符串
	//	4.复合数据类型
	//	 array slice mao function pointer struct interface channel...
	//	bool
	var a bool = true
	fmt.Printf("%t\n", a)

	//	byte == uint8
	//	rune == int32
	var b rune = 100
	fmt.Println(b)
	// 匿名函数,立即执行函数
	func(x, y int) {
		fmt.Println(x + y)
	}(1, 2)

	//	闭包
	f1(f3(f2, 2, 3))

}