前言
程序=数据+指令(算法)所以数据结构就是帮我们 解决 如何在程序开发过程 定义和存储要用到的数据;
Go语言的数据类型拥有丰富的数据类型
整型
.main.go:8:21: constant 1000 overflows uint8
在Python里面定义1个数字类型的变量,无需考虑系统底层内存存储这个变量 需要开销多大 存储空间(位),因为Python解释器自动计算、分配;在Go里面不行!
计算机只认识0、1,所谓有符号和无符号就是 计算机到底需要分配多大的存储空间(位/字节)来存储这些数字。
有符号整型:计算机使用第0位表示数字的 +正 -负性质,其他位用来表示数字
无符号整型:计算机使用全部的位 来表示数字
综上所述:
有符号整型:表示数字的位 比无符号少了1位,所以无符号整型可表示的正数数字范围更大
无符号整型:没有符号位所以无法表示 负数
有符号整型:
int8、int16、int32、int64
无符号整型:
uint8、uint16、unit32、uint64
int、uint、rune、byte
在Go语言中数字的默认数据类型是int类型,也就是有符号整型,如果是32的操作系统就是int32如果是64位操作系统就是int64
package main import ( "fmt" "unsafe" ) func main() { var n1 = 100 //n1的数据类型:int n1占用的字节数是8我的电脑是64位所以就是 int64 8位=1字节=8字节 fmt.Printf("n1的数据类型:%T n1占用的字节数是%d ", n1, unsafe.Sizeof(n1)) //在程序运行中,尽量使用占用空间减少的数据类型 比如年龄的数字范围1-200足矣,不需要用int64 var age byte = 19 println(age) }
整型变量的声明方式
为什么每中编程语言都有数据类型?
就是可以满足我们声明多样化的数据结构变量的需求,我们的程序逻辑可以处理各种各样的变量(数据)时,我们就可以完成更多的功能。
package main import "fmt" func main(){ //方法1:先声明再赋值 var n1 int32 n1=10 //方法2:var 声明时一起赋值 var n2 int8 =10 //方法3:简短声明自动推断19为默认为int类型 n3:=18 //方法4:int类型强制转换为int16 var n4=int16(19) fmt.Printf("%T,%T,%T,%T",n1,n2,n3,n4) }
浮点型
go语言中默认使用float64
float32
float64
package main import ( "fmt" ) func main() { var price float32 = 89.12 fmt.Println(price) var num1 float32 = -0.000089 var num2 float64 = -78909656.09 fmt.Println(num1, num2) //float64标识的精度要不 float32 更精确 var num3 float32 = -123.0000091 var num4 float64 = -123.0000091 fmt.Println(num3, num4) var n1 = 3.1444 fmt.Printf("%T", n1) //默认为float64 }
复数
coplex128
complex64
布尔值
Go里面的布尔值不能像Python那样和0和1做转换
true
false
字符串
Go的字符串由Utf-8编码,不能修改,1个汉字占用4个字节、1个英文字母占用1个字节的存储空间。
因为go使用rune(1个int32类型的数字) 表示中文字符,使用byte(1个uint8类型的数字)表示英文。
Python字符串的index方法:
a="1111" print((a.index("2")))
#找不到指定的元素Python报错:ValueError: substring not found
Golang字符串中的strings.index()方法:
package main import ( "fmt" "strings" ) func main() { testString := "Hello" index := strings.Index(testString,"W") fmt.Println(index)//找不到指定元素返回-1 }
practice
自定义1个string的split方法
package main import ( "fmt" "strings" ) func main() { str1 := "123a456a789" sep := "a" var ret []string //a的index index := strings.Index(str1, sep) //知道字符串中不包含a也就是index=-1为止 for index >= 0 { //a位置之前的部分:123 ret = append(ret, str1[:index]) //a位置之后的部分:456a789 str1 = str1[index+1:] index = strings.Index(str1, sep) } ret = append(ret, str1) fmt.Println(ret) }
字符串相关操作
go中字符串相关的操作的API都封装在strings包中
package main import ( "fmt" "strings" "unicode" ) func main() { s1 := "D:\goproject\src" //字符相关操作 //字符串长度 fmt.Println(len(s1)) //字符串拼接 FirstName := "Martin" LastName := "Zhang" FullName := FirstName + LastName fmt.Println(FullName) FullName2 := fmt.Sprintf("%s%s", LastName, FirstName) fmt.Println(FullName2) //字符串分割 s3 := "D:\goproject\src" ret := strings.Split(s3, "\") fmt.Println(ret) //包含 fmt.Println(strings.Contains(s3, "D")) //判断字符串 的开头和结尾判断 fmt.Println(strings.HasPrefix(s3, "D")) fmt.Println(strings.HasSuffix(s3, "src")) //判断字符在字符串中的index s2 := "abcdeb" fmt.Println(strings.Index(s2, "b")) fmt.Println(strings.LastIndex(s2, "b")) //最后1次出现的位置 //字符串拼接 s4 := "D:\goproject\src" ret4 := strings.Split(s4, "\") s5 := strings.Join(ret4, "/") fmt.Println(s5) //字符串表里 //字符:组成字符串的每1个元素 我们称之为字符,在go语言里通过''单引号来定义字符 //在go语言里字符分为2种:1种是byte 1种是rune //byte:给ascii 编码的字符起的别名 //rune:给Unicode编码的字符起的别名 var c1 byte = 'c' var c2 rune = '中' fmt.Printf("c1:%T c2:%T ", c1, c2) s6 := "hello 张根" //for 循环 按照1个字节循环(会出现乱码:因为中文和英文占用的字节不一致) // for i := 0; i < len(s6); i++ { // fmt.Printf("%c ", s6[i]) // } //for range 按1个字符循环 for _, v := range s6 { fmt.Printf("%c ", v) } //字符串修改 s7 := "白萝卜" s8 := []rune(s7) //把字符串强制转换为runne切片就可以修改字符串了 s8[0] = '红' //修改第一个字符 fmt.Println(string(s8)) //类型转换 n := 10 var f float64 f = float64(n) //整型 转成 float64类型 fmt.Println(f) fmt.Printf("%T ", f) //float64 //判读数据类型 s9 := "Hello张根" for _, v := range s9 { if unicode.Is(unicode.Han, v) { fmt.Print(string(v)) } } }
字符(char)
在Go中有字符的概念,使用单引号表示,需要注意的是,英文字符和中文字符,
Go 使用int 的 数据类型别名的方式来表示字符。其中rune为int32的数据类型别名表示中文,byte为uint8的数据类型别名用于表示英文
什么是数据类型别名?
In a nutshell just an other name name data type of Golang by you like way.
。。...
package main import "fmt" var c1 byte = 'c' var c2 rune = '中' type myInt = int func main() { var n myInt n = 100 fmt.Printf("%T ",n)//%T Myint还是int fmt.Printf("%T ", c1) //uint8 fmt.Printf("%T ", c2) //int32 }