(2).GO语言变量命名的独特优点
可以在一行中定义多个变量,而Java一行只能定义一个
var name, age string = "李明", "20"
package main // 这里的包一定要写成 main. import "fmt" // 导入包 func main() { // 主函数 var name, age string = "李明", "20" fmt.Println("姓名: ", name, " 年龄: ", age) // 打印输出如果两个类型想要链接的话,那么用的不是 "+" 号,而是 "," 号 }
2.变量的初始化💥
(1).定义和初始化分离
package main // 这里的包一定要写成 main. import "fmt" // 导入包 func main() { // 主函数 // 如果想要同时定义多个不同类型的变量有两种方式。 var ( name string //字符串默认为null age int //整形默认为0 ) name = "jsxs" //初始化 age = 20 //初始化 fmt.Println("姓名: ", name, " 年龄: ", age) // 打印输出如果两个类型想要链接的话,那么用的不是 "+" 号,而是 "," 号 }
(2).短变量声明初始化 (语法糖)
Go编译器它可以自动推导声明写法,编译器会自动根据右值类型推断出左值的对应类型。
它可以自动地推导一些类型,但是使用也是有限制的;
- 定义变量,同时要进行初始化
- 不能显式的提供数据类型
- 只能用在函数内部,不能随便到处定义
- 因为简介灵活的特点: 简短变量声明被广泛的用于大部分局部变量的声明和初始化。
- 由于使用了:=,而不是复制的=,因此推导声明写法的左值变量必须是没有定义过的变量;若定义过,将会发生编译错错误。
基本语法
变量名 := 值
根据变量名获取类型
fmt.Printf("%T,%T", name, age)
package main // 这里的包一定要写成 main. import "fmt" // 导入包 func main() { // 主函数 /** * 利用语法糖实现 定义变量的同时并进行初始化 */ name := "jsxs" age := 20 fmt.Println("姓名: ", name, " 年龄: ", age) // 打印输出如果两个类型想要链接的话,那么用的不是 "+" 号,而是 "," 号 fmt.Printf("%T,%T", name, age) //根据变量名查看数据类型 }
package main // 这里的包一定要写成 main. import "fmt" // 导入包 func main() { // 主函数 /** * 利用语法糖实现 定义变量的同时并进行初始化 */ var name string = "45" var name1 string = "456" name := "jsxs" // no new variables on left side of := age := 20 fmt.Println("姓名: ", name, " 年龄: ", age, name1) // 打印输出如果两个类型想要链接的话,那么用的不是 "+" 号,而是 "," 号 fmt.Printf("%T,%T", name, age) // }
3.理解变量 (内存地址)
占位符 %T 查看类型, 占位符 %d 查看整形值, 占位符 %p 查看地址 &取地址
package main // 这里的包一定要写成 main. import "fmt" // 导入包 func main() { // 主函数 num := 10 fmt.Printf("num:%d,内存地址: %p", num, &num) //占位符 %T 查看类型, 占位符 %d 查看整形值, 占位符 %p 查看地址 &取地址 num1 := 100 fmt.Printf("num1:%d,内存地址: %p", num1, &num1) //占位符 %T 查看类型, 占位符 %d 查看整形值, 占位符 %p 查看地址 &取地址 }
4.变量的交换 💥
Go语言底层帮助我们实现了变量交换,我们只需要进行简单操作即可
a, b, c = c, b, a // Go语言底层帮助我么实现了。
package main // 这里的包一定要写成 main. import "fmt" // 导入包 func main() { // 主函数 /* 变量交换----- 其他语言 C C++ Java a=100; b=200; temp=0; temp=a; a=b; b=temp; */ var a int = 100 var b int = 200 fmt.Println("交换前: a: ", a, "b ", b) a, b = b, a // Go语言底层帮助我么实现了。 fmt.Println("交换后: a: ", a, "b: ", b) }
5.匿名变量💥
匿名变量的特点是一个下划线"“,”"本身就是一个特殊的标识符,被称为空白标识符,它可以像其他标识符那样用于变量的声明或复制(任何类型都可以赋值给他),但任何赋值给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用使用这个标识符作为变量对其它变量进行赋值运算。使用匿名变量时,只需要在变量声明的地方使用下划线替换即可。
func test() (int, int) { // 第一个括号负责传参,第二个括号负责返回 return 100, 200 }
package main // 这里的包一定要写成 main. import "fmt" // 导入包 func test() (int, int) { // 第一个括号负责传参,第二个括号负责返回 return 100, 200 } func main() { // 主函数 a, b := test() //因为会返回两个值,我们接受一下 fmt.Println(a, b) c, _ := test() //返回值有很多,但我们只想要返回值的某一个值。那么我们就是用匿名变量_ 进行接取 fmt.Println(c) _, d := test() //返回值有很多,但我们只想要返回值的某一个值。那么我们就是用匿名变量_ 进行接取 fmt.Println(d) }
在编码过程中,可能会遇到没有名称的变量,类型或方法,虽然这不是必须的,但有时候这些做可以极大地增强代码地灵活性,这些变量称为匿名变量。
匿名变量不占用内存空间,不会分配内存,匿名变量与匿名变量之间也不会因为多次声明而无法使用。
6.变量的作用域
一个变量在程序中都有一定的作用范围,称之为作用域。
了解变量的作用域对我们学习Go语言是比较重要的,因为Go语言会在编译时检查每个变量是否使用过,一旦出现未使用的变量,就会报编译错误。如果不能理解变量的作用域,就有可能会带来一些不明的编译错误。
局部变量
定义在方法之内的变量叫做局部变量。
package main // 这里的包一定要写成 main. import "fmt" // 导入包 func main() { // 主函数 var name string = "jsxs" // 局部变量 var age int = 20 //局部变量 fmt.Println(name, age) } func aa() { fmt.Println(name) // undefined: name ----报错 }
局部变量的作用域只能在其规定的范围内使用,否则会报错。
全局变量
定义在方法之外的变量称之为全局变量
package main // 这里的包一定要写成 main. import "fmt" // 导入包 var name string = "jsxs" // 局部变量 func main() { // 主函数 var age int = 20 //局部变量 fmt.Println(name, age) } func aa() { fmt.Println(name) // undefined: name ----报错 }
全局变量和局部变量相等
当和局部变量和全局变量重名,局部会覆盖全局
package main // 这里的包一定要写成 main. import "fmt" // 导入包 var name string = "jsxs" // 局部变量 func main() { // 主函数 var age int = 20 //局部变量 name = "liming" fmt.Println(name, age) aa() } func aa() { fmt.Println(name) }