Go变量以及基本数据类型 | Go主题月

223 阅读6分钟

一、变量

1. 示例

声明变量

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

package main
import "fmt"

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

2. 变量使用注意事项

(1)变量不同的声明使用方式(尤其第三种是go特有的):

package main
import "fmt"

func main(){
	//golang的变量使用方式1
	//第一种:指定变量类型,声明后若不赋值,使用默认值
	var i int
	fmt.Println("i = ",i) //int默认值为0
  
  //第二种:根据值自行判定变量类型(类型推导)
	var num = 10.10
	fmt.Println("num = ",num)
  
  //第三种:省略关键字var 注意 := 左侧的变量不能是声明过的,否则重复声明会报错
	name := "jiajia" //等价于 var name string;  name = "jiajia"
	fmt.Println("name = ",name)
}

:= 使用限制:

  • 定义变量,同时显式初始化
  • 不能提供数据类型
  • 函数外不可使用

(2)一次性声明多个变量的方式

package main
import "fmt"

func main(){
	//一次性声明多个变量方式1,除最后一个变量类型外,其它变量类型可以删除
  var n1, n2 ,n3 int
	fmt.Println("n1 = ",n1,"n2 = ",n2,"n3 =",n3)

	//一次性声明多个变量方式2,使用类型推导
	var n1,n2,n3 = 100,"tom",888
	fmt.Println("n1 = ",n1,"n2 = ",n2,"n3 =",n3)

	//一次性声明多个变量方式3
	n1,n2,n3 := 100,"tom",888//等价于方式2
	fmt.Println("n1 = ",n1,"n2 = ",n2,"n3 =",n3)
}

(3)声明全局变量

就是在函数外声明变量

package main
import "fmt"

//一个一个的声明全局变量
var n1 = 100
var n2 = 200
var n3 = 800
//一次性声明全局变量
var (
	n4 = 400
	n5 = 900
)

func main(){
  fmt.Println("n1 = ",n1,"n2 = ",n2,"n3 =",n3,"n4 =",n4,"n5 = ",n5)
}

二、数据类型

1. 基本数据类型

1.1 整数类型

(1)有符号整数

类型表数范围占用存储空间
int8-128 ~ 1271字节
int16-215 ~ 215-12字节
int32-231 ~ 231-14字节
Int64-263 ~ 263-18字节

==补充基础知识:==

1字节的取值范围为什么是-128 ~ 127?

1字节8位,每位用0或1表示,能够表示28个数。

其中这8位中第一位是符号位(0表示正数,1表示负数),剩余7位为数值位。

那么 (+0000 0000:+0 )、(+0111 1111:+127)正数就是这样,但负数就没这么容易看出来了。

1111 1111 不等于-127,而是等于-1.

1000 0000不等于-0,而是等于-128

原因在于:

  1. 计算机存储有符号的整数都是存储它们的补码
  2. 正数和0的补码是其本身,而负数的补码是先转换为反码(符号位不变,其它位取反),再在反码的基础上加1

那么计算机在处理1111 1111时,过程就是:

  • 1111 1111是负数,而且现在是补码,要想转化为原码,先减1,变为1111 1110
  • 符号位(第一位)不变,其他位取反,变为1000 0001,也就是-1

那么此时若想要表示-128,假设byte不是占用8位,而是占用9位,最高位还是符号位,那么-128就是

1 1000 0000,其补码也是(1 0111 1111 -> 1 1000 0000),-128的补码尾8位就是1000 0000,故计算机规定了1000 0000就是-128。

(2)无符号整数(最高位可表示数)

类型表数范围占用存储空间
Uint80~2551字节
Uint160~216-12字节
Uint320~232-14字节
Uint640~264-18字节

(3) 其他整数类型

类型有无符号占用存储空间表数范围备注
int32位系统4个字节,64位系统8个字节-231 ~ 231-1,-263 ~ 263-1
uint32位系统4个字节,64位系统8个字节0232-1,0264-1
rune与int32一样-231 ~ 231-1代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。
byte与uint8等价0~255存储字符时用byte

常规的英文字符是ascii码是通过一个字节( 2^8 其实还有一位是不用的 )来存储,中国文字、日本文字常用文字就有4000+,通过2^8肯定表达不了,所有可以通过unicode来存储,占用2个字节,unicode编码包含了ascii码。

(4) 整数使用注意事项

  • 如何在程序中查看某个变量的字节大小和整数类型

    package main
    // import "fmt"
    // import "unsafe"
    
    import (
    	"fmt"
    	"unsafe"
    )
    
    func main(){
    	//如何在程序中查看某个变量的字节大小和整数类型
    	var n1 int64 = 10
    	fmt.Printf("n1的数据类型 %T  n1占用的字节数 %d ",n1,unsafe.Sizeof(n1))
    }
    

    输出结果:

    截屏2021-04-11 上午10.18.24

1.2 浮点类型

(1) 分类

类型占用存储空间表数范围
float324字节-3.403E38~3.403E38
float64(默认类型,相当于java中double)8字节-1.798E308~1.798E308
  • 浮点数 = 符号位+指数位+尾数位
  • 尾数部分可能丢失,造成精度丢失,float64要比float32精度更高

1.3 字符类型

Golang中没有专门的字符类型,如果要存储单个字符(字母),一般用byte来保存。

而传统字符串是由字符组成的,Go中字符串是由字节组成的。

package main

import (
	"fmt"
)

func main(){
	
	var c1 byte = 'a'
	var c2 byte = '0'

	//当我们直接输出byte值,实际上输出的是对应字符的码值
	fmt.Println("c1=",c1)
	fmt.Println("c2=",c2)
	//如果我们希望输出对应的字符,需要使用格式化输出
	fmt.Printf("c1=%c c2=%c\n",c1,c2)

	//var c3 byte = '马' //溢出
	var c3 int = '马' 
	fmt.Printf("c3=%c\n",c3)//格式化输出
	fmt.Printf("c3=%d",c3)//格式化输出c3的unicode编码
}

输出结果:

截屏2021-04-11 上午11.13.19

1.4 布尔型

默认值是false。

1.5 字符串类型

(1)Go中字符串一旦赋值,就不能修改了。

package main

import (
	"fmt"
)

func main(){
	var str = "hello" //自动匹配字符串类型
	str[0] = 'a'//这里不能赋值
	fmt.Println("str=",str)
}

截屏2021-04-12 下午2.59.06

(2)字符串的两种表现形式

  • 双引号,会识别转义字符
var str string = "hello world!"
  • 反引号

    以字符串原生形式输出,包括换行和特殊字符,可以实现防止攻击,输出源代码的发生。

    package main
    
    import (
    	"fmt"
    )
    
    func main(){
    
    	str2 := "abc\\jj"
    	fmt.Println(str2)
    
    //需求:把我们之前写的代码全部打印出来
    	str3 := `
    	package main
    
    import (
    	"fmt"
    )
    
    func main(){
    	
    	var c1 byte = 'a'
    	var c2 byte = '0'
    
    	//当我们直接输出byte值,实际上输出的是对应字符的码值
    	fmt.Println("c1=",c1)
    	fmt.Println("c2=",c2)
    	//如果我们希望输出对应的字符,需要使用格式化输出
    	fmt.Printf("c1=%c c2=%c\n",c1,c2)
    
    	//var c3 byte = '马' //溢出
    	var c3 int = '马' 
    	fmt.Printf("c3=%c\n",c3)//格式化输出
    	fmt.Printf("c3=%d",c3)//格式化输出
    
    }
    	`
    	fmt.Println(str3)
    }
    

    输出结果: 截屏2021-04-12 下午3.09.52

1.6 复数类型

有两种 complex128(默认) 和 complex64。

复数的值由三部分组成 RE + IMi,其中 RE 是实数部分,IM 是虚数部分,RE 和 IM 均为 float 类型,而最后的 i 是虚数单位。

package main

import (
	"fmt"
)

func main(){

	x := complex(5,2) // 输出为(5+2i)
	fmt.Println(x)
}