前言
程序=数据+指令(算法)所以数据结构就是帮我们 解决 如何在程序开发过程 定义和存储要用到的数据;
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
}