Bootstrap

Go- 变量

Go 学习笔记,学习内容

主要介绍以下内容:

  • 变量可不显示初始化

  • 变量的作用域

  • 变量类型可由编译器推导

  • 变量可使用简短声明语法

  • 变量值类型和引用类型

  • 变量的打印

  • 变量的声明和赋值语法

  • 变量赋值时的抛弃值

  • 变量的声明位置

  • 全局变量声明可不使用,局部变量声明必须使用

代码示例可以直接运行

package main

import (
	"fmt"
	"os"
	"runtime"
)

func main() {
	/*
	   1、当声明一个变量时,系统自动赋予他该变量的零值
	   int 0
	   float 0.0
	   bool false
	   string ""
	   指针 nil
	   2、变量命名遵循小驼峰命名法
	   3、如果全局变量需要被外部包使用,则使用大驼峰命名法
	   4、函数内声明的变量为局部变量,函数外声明的变量时局部变量,代码块中声明的变量作用域在代码块中
	   5、变量可以在编译期间进行赋值,也可以在运行期间进行赋值
	   6、一般情况下,当变量a和变量b的类型相同时,才进行a=b的赋值
	*/
	var a int
	var b bool
	var c float32 // float and complex were removed. Use float32 or float64
	var str string
	var p *int
	/*
	   以上代码等价于
	   var (
	      a int
	      b bool
	      str string
	  )
	*/
	fmt.Println(a, b, c, str, p) // 输出:0 false 0  

	var x int = 20 // 声明时赋值
	var i = 10     // 变量类型由编译器推导

	/*
	   编译错误:syntax error: unexpected newline, expecting type
	   因为编译器无法推断类型
	*/
	//var y

	var n int64 = 2 // 若自动推断类型为 int,这里需要显示指定 int64 类型
	fmt.Println(x, i, n)

	var (
		HOME   = os.Getenv("HOME")
		USER   = os.Getenv("USER")
		GOROOT = os.Getenv("GOROOT")
	)
	fmt.Println(HOME, USER, GOROOT)

	/*
	   var 方式声明的变量,主要用于声明包级别的全局变量,
	   当在行数内声明局部变量时,应使用简短声明语法 */
	w := 1
	m := "Hi"
	fmt.Println(w, m)

	/* 示例 */
	var goos string = runtime.GOOS
	fmt.Printf("The operation system is: %s\n", goos)
	path := os.Getenv("PATH")
	fmt.Printf("Path is %s\n", path)

	/*
	   值类型和引用类型(即值和指针)
	   Go 语言中的引用类型包括:指针、map、slices、maps、channel,
	   被引用的变量保存在堆中,以便进行垃圾回收,并且拥有更大的内存空间
	*/

	/*
	   打印函数
	   %s 字符串标志符
	   %v 使用类型的默认输出格式标志符
	*/
	fmt.Sprintf("%s", "string") // 无输出?
	fmt.Println("END")
	fmt.Print("%s", "string") // 无换行输出:%sstring
	fmt.Println("END")
	fmt.Printf("%s", "string") // 无换行输出:string
	fmt.Println("END")
	fmt.Println("%s", "string") // 换行输出:%sstring 使用默认输出格式输出格式 %v
	fmt.Println("END")

	// 编译错误:undefined: num
	//num = 1

	// 编译错误:no new variables on left side of :=
	//num := 1
	//num := 2

	num := 1
	num = 2
	fmt.Println(num) // 输出:2

	/*
	   若声明变量,但是没有使用,编译时出错:xxx declared but not used
	   声明全局变量可以不使用
	*/

	var a1, b1, c1 int   // 变量可以在同一行声明
	a1, b1, c1 = 5, 6, 8 // 变量可以在同一行赋值
	fmt.Println(a1, b1, c1)

	// 编译错误:cannot use "abc" (type untyped string) as type int in assignment
	//a1 = "abc"

	// 交换两个变量的值
	a1, b1 = b1, a1
	fmt.Println(a1, b1)

	// _ 表示抛弃值
	_, d1 := 2, 1000
	//fmt.Println(_)  // 编译错误:cannot use _ as value
	fmt.Println(d1) // 输出:1000

	// 变量除了可以在全局声明中初始化,也可以在 init 函数中初始化
}