go数据类型

发布时间 2023-06-14 06:15:56作者: mress

基础数据类型

image

byte和rune

image

字符串

常用方法

len(str) //求长度
strings.Split //分割
strings.Contains //判断是否包含
strings.HasPrefix , strings.HasSuffix //前缀 后缀判断
strings.Index() , strings.LastIndex() //子串出现的位置

数组

定义

//一维数组定义
arr := [5]int{} //定义一个长度为5,每个元素都为整形的数组
var arr [5]int = [5]int{1,2,3,4,5}
...
//定义二维数组
arr := [5][5]int //定义了一个5行5列的数组

数组的长度是固定的,数组中的每个元素的类型都相同

数组遍历

s := [5]int{1, 2, 3, 4}
for index, value := range s {
	fmt.Println(index, value)
}

切片

切片底层基于数组实现,本生为指针,切片长度len不等于capacity,预留了空间等待填入值

image

定义

var s []int // len=cap=0
s := []int{} // len=cap=0
s = make([]int,3) // len=cap=3
s = make([]int,3,5) // len=3, cap=5
s = int[]int{1,2,3,4,5} // len=cap=5
s2d := [][]int{
  {1},{2,3} // 二维数组各行的列数相等,但二维切片各行的len可以不等
}

切片方法

1 append //用于向预留空间添加值,达到上限时扩容
s := make([]int, 3, 5)
s = append(s, 9)

image

切片的遍历

s := []int{1, 2, 3, 4}
for index, value := range s {
	fmt.Println(index, value)
	}

map

指针类型

image

map的初始化

var m map[string]int //声明map,指定key和value的数据类型
m = make(map[string]int) //初始化,容量为0
m = make(map[string]int,200) //初始化,容量为200
m := map[string]int{"语文":0,"数学":39} //初始化时直接赋值

删除和添加key

m["英语"] = 59 //往map里添加key-value对
m["英语"] = 70 //会覆盖之前的值
delete(m,"") //从map里删除key-value对
len(m) //获取map的长度
go不支持对map执行cap函数

map的遍历

m := map[string]int{"语文": 2, "数学": 22}
for k, v := range m {
	fmt.Println(k, v)
}

管道

指针类型,环状队列,不可扩容

image

管道的声明和初始化

var ch chan int //声明
ch = make(chan int,8) //初始化,环形队列可容纳8个元素

send和revc

ch := make(chan int, 8)
	ch <- -1  // 添加
	ch <- -2
	v1 := <-ch //取出
	v2 := <-ch
	fmt.Println(v1)
	fmt.Println(v2)

关闭管道

close(ch) //关闭管道之后就不允许往管道里写入了

管道的遍历

ch := make(chan int, 8)
ch <- -1
ch <- -2
close(ch) //遍历之前需要先关闭管道
for v := range ch {
	fmt.Println(v)
}

go中值传递的三种情况

1 =号赋值
a := 11
b := a

2 函数入参
func ChangeArr(arr [5]int) {
  fmt.Println(arr) //函数内部的arr和外部的arr的内存地址并不相同
}

func main() {
  arr := [5]int{1, 2, 3, 4, 5}
  ChangeArr(arr) //将arr拷贝的新的内存地址中,在函数内部使用新的arr
}


3 函数出参
func CreateArr() [5]int {
	arr := [5]int{1, 2, 3, 4, 5}
	return arr //函数中创建的arr数组
}
func main() {
  arr := CreateArr() //拷贝返回的函数赋值arr
}

引用类型

slice、map和channel是go于语言里的3中引用类型,都是通过make函数来进行初始化(申请内存分配)

因为他们都包含一个指向底层数据结构的指针,所以称他们为引用类型

引用类型未初始化时都是nil,可以对他们执行len()函数返回0

强制类型转换

低精度向高精度转换没问题,高精度向低精度转换会丢失位数
无符号向有符号转换,最高位是符号位
byte和int可以互相转换
float和int可以互相转换,小数位会丢失
bool和int不能相互转换
不同长度的int或float之间可以相互转换
不能对常量执行强制类型转换

string和int互转

var err error
var i int = 8
var i64 int64 = int64(i)
var s string = strconv.Itoa(i) //int转string,内部调用formatInt

s = strconv.FormatInt(i64,10) //int64转string
i, err = strconv.Atoi(s) //string转int
i64,err = strconv.ParseInt(s,10,64) //string转int64

string和float互转

//float转string
var f floaty4 = 8.23
s := strconv.FormatFloat(f,'f',2,64)

//string转float
f, err = strcon.ParseFloat(s,64)