一、变量
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 ~ 127 | 1字节 |
| int16 | -215 ~ 215-1 | 2字节 |
| int32 | -231 ~ 231-1 | 4字节 |
| Int64 | -263 ~ 263-1 | 8字节 |
==补充基础知识:==
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
原因在于:
- 计算机存储有符号的整数都是存储它们的补码
- 正数和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)无符号整数(最高位可表示数)
| 类型 | 表数范围 | 占用存储空间 |
|---|---|---|
| Uint8 | 0~255 | 1字节 |
| Uint16 | 0~216-1 | 2字节 |
| Uint32 | 0~232-1 | 4字节 |
| Uint64 | 0~264-1 | 8字节 |
(3) 其他整数类型
| 类型 | 有无符号 | 占用存储空间 | 表数范围 | 备注 |
|---|---|---|---|---|
| int | 有 | 32位系统4个字节,64位系统8个字节 | -231 ~ 231-1,-263 ~ 263-1 | |
| uint | 无 | 32位系统4个字节,64位系统8个字节 | 0 | |
| 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)) }输出结果:
1.2 浮点类型
(1) 分类
| 类型 | 占用存储空间 | 表数范围 |
|---|---|---|
| float32 | 4字节 | -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编码
}
输出结果:
1.4 布尔型
默认值是false。
1.5 字符串类型
(1)Go中字符串一旦赋值,就不能修改了。
package main
import (
"fmt"
)
func main(){
var str = "hello" //自动匹配字符串类型
str[0] = 'a'//这里不能赋值
fmt.Println("str=",str)
}
(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) }输出结果:
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)
}