变量
变量的定义、赋值和使用
var i int // var 变量名 数据类型
var j float32
i = 10
fmt.Println(i)
注意事项:
- 指定变量类型,声明后如果不赋值则使用默认值(int 默认值为0)
- 如果不指定变量类型,根据值自行判定变量类型(类型推导)
- 省略var关键字,可以使用:=号来声明变量并进行赋值
var i int
i = 10
// 等价于
i := 10 // 类型推导,无需指定变量类型
一次性声明多个变量:
var n1,n2,n3 int // 一次性声明三个变量
var n1,name,n3 = 100,"tom",1000
n1,name,n3 := 100,"tom",1000 // 类型推导,无需指定变量类型
全局变量的声明:
在go
中在函数外声明的变量都是全局变量
// 一次性定义多个全局变量
var n4 = 300
var n5 = 500
var (n1 = 300
n2 = 400
name = "go"
)
func main(){
}
注意事项:
-
在同一作用域内变量的数据类型不能被改变,但是可以强转之后复制给其他类型变量
-
变量在同一个作用域内不能重名,不能重复定义
-
变量的三要素:变量名、变量值、数据类型
-
默认值:如果变量没有赋初值,编译器会使用默认值,如int为0,字符串为空,浮点类型为0,布尔值为false
基本数据类型
- 数值型
整数类型
int int8 int16 int32 int64(uint无符号)
int 在32位os中是32位,在64位os中是64位
rune
类型,等价于int32,其表示一个unicode
码
// 使用rune类型来存储中文
var name rune = '中'
// 通过Printf来格式化输出
fmt.Printf("%c", name)
浮点类型,浮点值的类型默认为float64
float32 float64
- 字符型
没有专门的字符型,使用byte来保存单个字符
注意事项:
byte
等价于uint8
- 字符常量通过单引号来表示,双引号会报错。
go
语言中编码采用utf-8
编码。- 如果不使用格式化输出(
Printf
)而使用(Println
)输出则直接输出UTF-8码值。 - 字符类型是可以直接进行运算,相当于一个整数(码值)
- 布尔类型(默认为false)
只能取true或者false,占一个字节
- 字符串类型
字符串是固定长度的字符连接起来的字符序列,go
中的字符串由字节组成。
Go语言的字符串的字节使用UTF-8编码来表示Unicode字符
注意事项
- Go中字符串不可变,一旦赋值之后不能被修改
- 字符串中的表示形式
- 双引号:有转义符会识别
- 反引号:以字符串的原生形式输出,包括换行和特殊字符
- 通过+号可以实现字符串的拼接,换行拼接需要把+留在上面一行
派生/复杂数据类型
- 指针
- 数组
- 结构体(struct)
- 管道
- 函数
- 切片
- 接口
- map类型
查看数据类型和变量所占用字节数
import (
"fmt"
"unsafe"
)
func main() {
// 通过Printf格式化输出函数 来查看数据类型
var chr byte = 'a'
fmt.Printf("%c,%T", chr, chr) // 格式化输出chr(以字符输出),并查看数据类型
/*
output:a,uint8
*/
// 通过unsafe包中的Sizeof方法可以获取到变量的占用的字节数
fmt.Printf("chr 占用的字节数:%d",unsafe.Sizeof(chr))
/*
chr 占用的字节数:1
*/
}
基本数据类型的转换
Go中的数据类型需要显示转换(强转)
必须要需要强制转换,所以两个变量在进行运算时需要注意变量类型是否匹配。
转换的基本语法:T(v),将值v转化为T类型,低精度向高精度转换同样需要。
var i int32 = 100
var j float32 = float32(i)
var k int64 = int64(i)
注意事项:
- 被转换的是变量存储的数据(值),但是变量本身的数据类型并没有变化
- 在转换时,从int64转化为int8时,编译不会报错,但是会进行截断。
- 在进行除法运算时,**如果两个整数相除,则结果默认取整,**如果需要保留小数,则需要对除数和被除数进行类型强制转换。
var intArr1 [5]int = [5]int{1, 33, 3, 45, 16}
sum := 0
for _, val := range intArr1 {
sum += val
}
fmt.Println(sum, float64(sum)/float64(len(intArr1)))
基本类型转化
基本数据类型转string
- 通过
fmt.Sprinf()
方法转换
返回转化后的字符串
var iii int = 32
str = fmt.Sprintf("%d", iii)
fmt.Printf("%T", str)
- 通过
strconv
包中的函数
var iii int = 32
str = fmt.Sprintf("%d", iii)
fmt.Printf("%T", str)
str2 = strconv.FormatInt(int64(iii), 10) // 将10进制的iii转化成字符串
fmt.Println(str)
// FormatFloat(floatnums,'f',10,64):将floatnums这个64位的小数值转化成字符串,小数保留10位,输出格式为f(还可以以e,科学计数法方式输出)
// FormatBool()
// Itoa(int),接收int类型,数字转string
string转基本数据类型
- 使用
strconv
包中下面四个函数来进行转换
返回值是两个,一个是值还一个错误变量。
注意事项:
String转基本数据类型:
- 需要确保string可以转成有效的数据,例如把“123”转成整数,如果没有转成功会默认转成0值 (对应类型的默认值)
指针
- 对于基本数据类型,变量存的是值,也叫值类型。
- 获取变量的地址用&符号,对于变量
i
,其地址为&i
- 指针类型变量存储的是一个地址,这个地址指向的内存空间才是值
- 获取指针类型所指向的值,使用*,例如p为指针类型,*p表示指向的值
var i int = 10 // 定义整型
var p *int = &i // 定义一个int类型指针变量。该类型(int)需要和所指向的变量地址存储的类型对应
fmt.Println("address of i is ",p)
fmt.Println("The address of pointer p is",&p)
fmt.Println("The value pointed to by the pointer p is",*p)
/*
output:
address of i is 0xc0000aa058
The address of pointer p is 0xc0000ce018
The value pointed to by the pointer p is 10
*/
通过指针修改变量值
*p = 13
fmt.Println("The value changed of i is ,", i)
注意事项:
- 指针变量只能被赋值成地址
- int类型的指针变量只能接收int类型变量的地址
var a int32 = 300
// var ptr *float32 = &a 无法将int类型的变量a的地址赋值给float32类型的指针变量ptr
var b float32 = float32(a) // 需要进行强制转换
var ptr *float32 = &b
- 值类型,都有对应的指针类型,形式为*数据类型,比如int类型,其对应的指针类型为*int,float32对应的指针类型就是*float32。
- 值类型包括:基本数据类型int,float,bool,string,数组和结构体struct
- 引用类型:指针、slice切片、map、管道、interface等
值类型和引言类型的使用特点:
- 值类型:变量直接存储,内存通常在栈中分配
- 引用类型:其存储的是一个地址,地址指向的空间才是真正存储值,内存通常在堆区分配,当没有任何变量引用这个地址时,该地址对应的数据空间成为垃圾,被GC回收。
变量命名规范
- 变量名、函数名、常量名采用驼峰法
- 如果变量名、函数名、常量名首字母大写,则可以被其他包访问(公有);如果首字母小写,则只能在本包中使用(私有)。
Golang
中没有privacy
、public
等关键字。