GolangStudy/day4/var.go

85 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package main
import "fmt"
func main() {
// var 变量名字 类型 = 表达式
var hello string = "world"
fmt.Println(hello)
// 其中“类型”或“= 表达式”两个部分可以省略其中的一个。
// 如果省略的是类型信息,那么将根据初始化表达式来推导变量的类型信息。
// 如果初始化表达式被省略,那么将用零值初始化该变量。
// Go语言中不存在为初始化的变量
//可以在同一句声明语句中声明不同类型的变量
var b, f, s, i = true, 3.1415926, "four", 5 // bool float string int
fmt.Println(b, f, s, i)
// 可以使用简短变量声明
// 名字 := 表达式
operation := 1 + 10 - 6 // 5
fmt.Println(operation)
// 可以十分简单的交换两个变量的值
var number1, number2 int = 2, 6 // 2, 6
fmt.Println("before:", number1, number2) // 2, 6
// swap。。。
number1, number2 = number2, number1 // 交换
fmt.Println("after:", number1, number2) // 6, 2
// 指针
// 一个变量对应一个保存了变量对应类型值的内存空间。
// 声明指令变量时 *类型为该类型的指针类型
// 例如*int代表int指针类型*bool为bool型的指针类型
// &变量 代表取这个变量的地址
// 注意: 指针类型的变量本身也具有地址,可以被&取地址操作
var point *int = &operation
//*point 代表访问指令变量指向的变量的原始值
fmt.Println(*point) // 5
*point = 10 + 2 // 12
fmt.Println(*point) // 12
//任何类型的指针的零值都是nil。如果p指向某个有效变量那么p != nil测试为真。
//指针之间也是可以进行相等测试的只有当它们指向同一个变量或全部是nil时才相等。
var point1, point2 *int
fmt.Println(point1 == point1, point1 == point2, point1 == nil)
// true true true
point1, point2 = &operation, &operation
fmt.Println(point1 == point2) // true
// 在Go语言中返回函数中局部变量的地址也是安全的。
//例如下面的代码调用f函数时创建局部变量v在局部变量地址被返回之后依然有效
fun1 := func() *int {
v := 1
return &v
}
fmt.Println(fun1() == fun1()) // false
// 另一个创建变量的方法是调用内建的new函数。
// 表达式new(T)将创建一个T类型的匿名变量
// 初始化为T类型的零值然后返回变量地址
// 返回的指针类型为*T
point3 := new(int) // 创建一个*int类型的指针变量指向匿名函数此函数为int型
*point3 = 34
fmt.Println(*point3) // 34
// new()函数和普通声明指针类型的变量没有任何区别new()更类似于语法糖
// 下面fun2(), fun3()两个函数有着相同的行为
fun2 := func() *int {
return new(int)
}
fun3 := func() *int {
var temp int
return &temp
}
// false 因为 两个函数申请的不同的变量
point4, point5 := fun2(), fun3()
fmt.Println("point4 == point5:", point4 == point5) // false
// 每次调用new函数都是返回一个新的变量的地址因此下面两个地址是不同的
point4, point5 = new(int), new(int)
fmt.Println("point4 == point5:", point4 == point5) // false
}