小白学Go| 说说Go中变量那些事~

简介: 小白学Go| 说说Go中变量那些事~

目录

1. 小白学Go系列开干!


变量

可以一次定义一个变量,也可定义多个变量


package main
import "fmt"
func main() {
 var a string = "Ekko"
 fmt.Println(a)
 var b, c int = 1, 2
 fmt.Println(b, c)
}
输出结果:
Ekko
1 2


变量声明

第一种,指定变量类型,如果没有初始化,则变量默认为零值。零值就是变量没有做初始化时系统默认设置的值。


package main
import "fmt"
func main() {
    // 声明一个变量并初始化
    var a = "Ekko"
    fmt.Println(a)
    // 没有初始化就为零值
    var b int
    fmt.Println(b)
    // bool 零值为 false
    var c bool
    fmt.Println(c)
}
>Ekko
>0
>false


关于零值的说明:

  • 数值类型:0
  • 布尔类型:flase
  • 字符串:“”(空字符串)
  • 以下的几种类型为nil


var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error // error 是接口


实例:


package main
import "fmt"
func main() {
    var i int
    var f float64
    var b bool
    var s string
    fmt.Printf("%v %v %v %q\n", i, f, b, s)
}


输出结果:


0 0 false ""


第二种,根据值自行判定变量类型。


var v_name = value


实例


package main
import "fmt"
func main() {
  var d = true
  fmt.Println(d)
}


输出结果是:


true


第三种,省略 var, 注意 := 左侧如果没有声明新的变量,就产生编译错误,格式:


v_name := value


例如:


var intVal int 
intVal :=1 // 这时候会产生编译错误
intVal,intVal1 := 1,2 // 此时不会产生编译错误,因为有声明新的变量,因为 := 是一个声明语句


可以将 var f string = "Ekko" 简写为 f : "Ekko":

实例


package main
import "fmt"
func main() {
  f := "Ekko" // var f string = "Ekko"
  fmt.Println(f)
}


输出结果是:


Ekko


多变量声明


//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3
var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要显示声明类型,自动推断
vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误
// 这种因式分解关键字的写法一般用于声明全局变量
var (
    vname1 v_type1
    vname2 v_type2
)


实例


package main
var x, y int
var (  // 这种因式分解关键字的写法一般用于声明全局变量
    a int
    b bool
)
var c, d int = 1, 2
var e, f = 123, "hello"
//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"
func main(){
    g, h := 123, "hello"
    println(x, y, a, b, c, d, e, f, g, h)
}


以上实例执行结果为:


0 0 0 false 1 2 123 hello 123 hello


值类型和引用类型

所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值:


15.jpg


当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝:


16.png


你可以通过 &i 来获取变量 i 的内存地址,例如:0xf840000040(每次的地址都可能不一样)。值类型的变量的值存储在栈中。

内存地址会根据机器的不同而有所不同,甚至相同的程序在不同的机器上执行后也会有不同的内存地址。因为每台机器可能有不同的存储器布局,并且位置分配也可能不同。

更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。

一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。


17.jpg


这个内存地址为称之为指针,这个指针实际上也被存在另外的某一个字中。

同一个引用类型的指针指向的多个字可以是在连续的内存地址中(内存布局是连续的),这也是计算效率最高的一种存储形式;也可以将这些字分散存放在内存中,每个字都指示了下一个字所在的内存地址。

当使用赋值语句 r2 = r1 时,只有引用(地址)被复制。

如果 r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容,在这个例子中,r2 也会受到影响。

相关文章
|
3月前
|
存储 安全 编译器
掌握Go语言:探索Go语言中的变量,灵活性与可读性的完美结合(4)
掌握Go语言:探索Go语言中的变量,灵活性与可读性的完美结合(4)
|
3月前
|
JSON JavaScript Go
Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析
掌握 Go 语言的常见概念,如变量、循环、条件语句、函数、数据类型等等。深入了解 Go 基础知识的好起点是查阅 Go 官方文档
861 2
|
3月前
|
Go
Go入门速成-定义变量
Go入门速成-定义变量
|
12天前
|
Go
Go1.22 新特性:for 循环不再共享循环变量,且支持整数范围
Go1.22 新特性:for 循环不再共享循环变量,且支持整数范围
|
2月前
|
算法 编译器 Go
Go语言中,常量和变量的定义和使用
Go语言中,常量和变量的定义和使用
|
2月前
|
存储 安全 Go
【Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举中的奥秘
【Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举中的奥秘
31 2
|
3月前
|
Go CDN
Go 语言变量作用域
Go 语言变量作用域
28 4
|
2月前
|
Go
go反射获取变量类型、值、结构体成员、结构体方法
go反射获取变量类型、值、结构体成员、结构体方法
25 0
|
2月前
|
Go
go变量定义、变量交换、匿名变量
go变量定义、变量交换、匿名变量
15 0
|
3月前
|
存储 编译器 Go
Go 语言变量
Go 语言变量
23 0