Golang变量|青训营

74 阅读9分钟

为什么需要变量?

  • 变量是程序的基本组成单位
  • 不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位

变量介绍

概念

变量相当于内存中一个数据存储空间的表示,你可以把变量看作是一个房间的门牌号,通过门牌号我们可以找到房间,同样的道理,通过变量名可以访问到变量(值)。

变量使用的基本步骤

  1. 声明变量(定义变量)
  2. 非变量赋值
  3. 使用变量

变量使用快速入门

func main(){
    //定义变量
    var i int
    //给i赋值
    i = 10
    //使用变量
    fmt.Println("i=",i)
    }

变量使用注意事项

  1. 变量表示内存的一个存储区域
  2. 该区域有自己的名称(变量名)和类型(数据类型)
  3. Golang变量使用的三种方式
    1. 指定变量类型,声明后若不赋值,使用默认值
    2. 根据值自行判定变量类型(类型推导)
    3. 省略var。注意:=左侧的变量不应该是已经声明过的,否则会导致编译错误。
    func main(){
        //1)指定变量类型,声明后若不赋值,使用默认值
        var i int  //int 默认值为0
        fmt.Println("i=",i)
    
        //2) 根据值自行判定变量类型(类型推导)
        var num = 12.13 //浮点型
        var str = "I love" //字符串类型
    
        //3) 省略var
        name := "JiuNuan" //等价于var name = "JiuNuan"
        }
    
  4. 多变量声明

在编程中,有时我们需要一次性声明多个变量,Golang也提供这样的语法。

func main(){
    //1)指定变量类型,声明后若不赋值,使用默认值
    var i, j, k int  //int 默认值为0
    fmt.Println("i=", i,"j=", j, "k=", k)

    //2) 根据值自行判定变量类型(类型推导)
    var a, num, str = 2023, 8.17, "I love"
    //对应的 a = 2023
    //    num = 8.17
    //    str = "I love"
    
    //3) 省略var
    a, num, str := 2023, 8.17, "I love"
    //对应的 a = 2023
    //    num = 8.17
    //    str = "I love"
}
  1. 该区域的数据值可以在同一类型范围内不断变化【重点】

image.png 6. 变量在同一作用域内(在一个函数或者在代码块)内不能重名

image.png

  1. 变量=变量名+值+数据类型——变量的三要素
  2. Golang的变量如果没有赋初值,编译器会使用默认值,比如 int 默认值为 0,string 默认值为 空串。

变量的声明,初始化和赋值

声明变量

基本语法:var+变量名+数据类型

var a int 这就是声明了一个整型变量,变量名是a
var num float32 这声明了变量,表示一个单精度类型的小数,变量名是num

初始化变量

在声明变量的时候,就给值

var a int = 45 这就是初始化变量a
使用细节:如果声明时就直接赋值,可省略数据类型,如var b = 100

给变量赋值

比如你先声明变量:var num int -->默认为 0
然后,再给值num = 780,这就是给变量赋值

程序中的"+"使用

  • 当左右两边都是数值型时,则做加法运算
  • 当左右两边都是字符串,则做字符串拼接

image.png

变量的数据类型

每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间。

mindmap
    数据类型
        基本数据类型
            数值型
                整数类型
                    int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64、byte
                浮点类型
                    float32、float64
            字符型
                没有专门的字符型,使用byte来保存单个字母字符
            布尔型(bool)
            字符串(string)
        派生/复杂数据类型
            指针(Pointer)
            数组
            结构体(struct)
            管道(channel)
            函数
            切片(slice)
            接口(interface)
            map

整数类型

基本介绍

在Golang中,整数类型包括有符号整数和无符号整数。 下面是Golang中常用的整数类型及其范围:

整数类型符号及存储空间范围
int8有符号8位整数-272^7 ~ 2712^7-1
-128~127
int16有符号16位整数-2152^{15} ~ 21512^{15}-1
-32768~32767
int32有符号32位整数-2312^{31} ~ 23112^{31}-1
-2147483648~2147483647
int64有符号64位整数-2632^{63} ~ 26312^{63}-1
-9223372036854775808~9223372036854775807
int有符号整数在32位系统上为32位,在64位系统上为64位,范围根据系统而定
uint8无符号8位整数00 ~ 2812^{8}-1
0~255
uint16无符号16位整数00 ~ 21612^{16}-1
0~65535
uint32无符号32位整数00 ~ 23212^{32}-1
0~4294967295
uint64无符号64位整数00 ~ 26412^{64}-1
0~18446744073709551615
uint无符号整数在32位系统上为32位,在64位系统上为64位,范围根据系统而定
rune有符号32位整数-2312^{31} ~ 23112^{31}-1
-2147483648~2147483647
等价int32,表示一个Unicode码
byte无符号8位00 ~ 2812^{8}-1
0~255
当要存储字符时,选用byte

需要注意的是,整数类型在不同系统上的大小可能会有所不同,具体取决于所使用的操作系统和底层硬件平台。使用时应根据实际需求选择适当的整数类型,以确保数据的表示范围和精度符合预期。

整型的使用细节

  1. Golang各整数类型:有符号和无符号,int uint的大小和系统有关
  2. Golang的整型默认声明为int型
  3. 如何在程序查看某个变量的字节大小和数据类型
var i int = 100
fmt.Printf("i的数据类型%T 占用的字节数是%d", i, unsafe.Sizeof(i))
//unsafe.Sizeof()函数获取字节大小

image.png 4. Golang程序中整型变量在使用时,遵守保小不保大的原则,即在保证程序正常运行下,尽量使用占用空间小的数据类型 5. bit:计算机中最小存储单位
byte:计算机中基本存储单元
1 byte = 8 bit

小数类型/浮点型

基本介绍

类型符号及存储空间范围
float32单精度,4字节-3.403E38~3.403E38
float64双精度,8字节-1.798E308~1.798E308
注:
  1. 浮点数 = 符号位 + 指数位 + 尾数位
  2. 尾数部分可能丢失,造成精度损失

image.png

浮点型使用细节

  1. Golang浮点类型有固定的范围和字段长度,不受具体操作系统(32位/64位)的影响

  2. Golang的浮点型默认声明为float64

  3. 浮点型常量有两种表示形式:

    1. 十进制数形式:5.12、0.512(必须有小数点)
    2. 科学计数法形式;5.12e2=5.12×1025.12E5.12e2 = 5.12 \times 10^2\\ 5.12E-2=5.12×1022 = 5.12 \times 10^{-2}

    image.png

  4. 通常情况下,使用float64,精度比float32高

字符类型(char)

基本介绍

Golang没有专门的字符类型,如果要存储单个字符(字母),一般用byte保存。
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的,也就是说对于传统的字符串是由自由组成的,而Go的字符串不同,是由字节组成的

// 演示golang中字符类型使用
func main() {
	var c1 byte = 'a'
	var c2 byte = '0' //字符的0
	//当我们直接输出byte值,就是输出了的对应的字符的码值
	//'a' ==> 97  '0' ==> 48
	fmt.Println("c1=", c1)
	fmt.Println("c2=", c2)
	//如果我们希望输出对应字符,需要使用格式化输出
	fmt.Printf("c1=%c \nc2=%c \n", c1, c2)
	//var c3 byte =北’//overflow溢出
	var c3 int = '北'
	//overflow溢出
	fmt.Printf("c3=%c c3对应码值=%d", c3, c3)
}

image.png

注:

  1. 如果保存的字符在ASCII表,如0、1、a、b...可以直接保存到byte
  2. 如果保存的字符对应码值大于255,这时我们可以考虑使用int类型保存
  3. 如果需要按照字符的方式输出,这时需要格式化输出 即fmt.Printf("%c",c)

字符类型使用细节

  1. 字符常量是用单引号('')包括起来的单个字符。如
var c1 byte = 'a'
var c2 byte = '0' //字符的0
  1. Go中允许使用转义字符''来将其后的字符转变为特殊字符型常量。如
var c3 char = '\n' //n'表示换行符
  1. Go语言的字符使用UTF-8编码,UTF-8码值查询
  2. 在Go中,字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码的码值
  3. 可以直接给一个变量赋值一个数字,然后按格式化输出时%c,会输出该数字对应的unicode字符
  4. 字符类型是可以进行运算的,相当于一个整数,因为他都有对应的Unicode码

image.png

字符类型本质

  1. 字符型 存储到 计算机中,需要将字符对应的码值(整数)找出
    1. 存储:
    graph LR
    字符 --> 对应码值 --> 二进制 --> 存储
    
    1. 读取:
    graph LR
    二进制 --> 对应码值 --> 字符 --> 读取
    
  2. 字符和码值的对应关系是通过字符编码表决定的
  3. Golang的编码都统一成了UTF-8

布尔类型(bool)

基本介绍

  1. bool类型数据只允许取值true和false
  2. bool类型占1个字节
  3. bool类型适用于逻辑运算,一般用于程序流程控制
  4. bool类型不可用1或0代替true或false,这与C语言不同

字符串类型(string)

基本介绍

字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的Go语言的字符串的字节使用UTF-8编码标识Unicode文本

注意事项和使用细节

  1. Golang的字符串的字节使用UTF-8编码表示Unicode文本,这样Golang统一使用UTF-8编码,中文乱码问题不会困扰程序员

  2. 字符串一旦赋值,字符串就不能修改了:在Go中字符串是不可变的

    image.png

  3. 字符串的两种表示形式

    1. 双引号(""),会识别转义字符
    2. 反引号(``),以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果
    func main() {
        //双引号(""),会识别转义字符
        str1 := "Hello World\n" 
        //反引号(``),以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果
        str2 := `fmt.Printf("Hello World\n")`
        fmt.Printf(str1)
        fmt.Printf(str2)
    }
    

    image.png

  4. 字符串的拼接方式:加号(+) image.png