Go语言的基本数据类型
-
整形
类型 描述 uint8 无符号 8位整型 (0 到 255) uint16 无符号 16位整型 (0 到 65535) uint32 无符号 32位整型 (0 到 4294967295) uint64 无符号 64位整型 (0 到 18446744073709551615) int8 有符号 8位整型 (-128 到 127) int16 有符号 16位整型 (-32768 到 32767) int32 有符号 32位整型 (-2147483648 到 2147483647) int64 有符号 64位整型 (-9223372036854775808 到 9223372036854775807) 类型 描述 uint 32位操作系统上就是 uint32
,64位操作系统上就是uint64
int 32位操作系统上就是 int32
,64位操作系统上就是int64
uintptr 无符号整型,用于存放一个指针 package main import "fmt" //不同进制的整形 //Go不支持直接赋值为二进制的数,但可以转换 func main() { //十进制 i1 := 101 fmt.Printf("%d\n", i1) //输出十进制结果 fmt.Printf("%b\n", i1) //转换为二进制 fmt.Printf("%o\n", i1) //转换为八进制 fmt.Printf("%x\n", i1) //转换为十六进制 //八进制 i2 := 077 //以0开头表示八进制数 fmt.Printf(i2) //输出十进制结果 fmt.Printf("%d\n", i2) //转化为十进制结果 fmt.Printf("%o\n", i2) //输出八进制结果 //十六进制 i3 := 0x5f //以0x开头表示16进制的数 fmt.Printf("%d\n", i3) //输出十进制结果 fmt.Printf("%x\n", i3) //转换为十六进制 //查看变量类型 fmt.Printf("%T\n", i1) //声明其他类型的int i4 := int8(6) //64位机上默认为int64,声明其他的需要转换 fmt.Printf("%T", i4) }
-
浮点型
package main import "fmt" //Go的浮点数只有32位和64位两种类型 func main() { // math.MaxFloat32表示32位的最大浮点数 f1 := 1.23456 fmt.Printf("%f:%T\n", f1, f1) //默认Go语言的float为64位 f2 := float32(1.23456) //声明32位的浮点数 fmt.Printf("%f:%T", f2, f2) //f1=f2出错,因为类型不同不能直接转换 }
-
复数
//复数有complex64和complex128,64有32位实部和32位虚部,128有64位实部和64位虚部 var c1 complex64 c1 = 1 + 2i var c2 complex128 c2 = 2 + 3i fmt.Println(c1) fmt.Println(c2)
-
布尔值
Go语言中以
bool
类型进行声明布尔型数据,布尔型数据只有true(真)
和false(假)
两个值。1.布尔类型变量的默认值为
false
。
2.Go中不允许将整型强制转换为布尔型
3.布尔型无法参与数值运算,也不能和其他类型进行转换package main import "fmt" func main() { b1 := true var b2 bool //不赋值默认为false fmt.Printf("%v:%T\n", b1, b1) fmt.Printf("%v:%T\n", b2, b2) //%v可以打印变量的值,这个变量可以是任意值 }
-
打印占位符总结
类型 描述 %T 查看数据类型 %v 查看数据的值(可以为任何类型) %b 将数以二进制形式输出 %o 将数以八进制形式输出 %d 将数以十进制形式输出 %x 将数以十六进制形式输出 %s 以字符串的形式输出 %c 以字符的形式输出 %p 输出变量的指针 %f 将数以浮点数的形式输出 package main import "fmt" //占位符只能用在printf函数格式里,不能直接打印变量的值。而print和println能打印变量或值,而且多个变量可以用隔开共同打印,但是不能使用占位符 func main() { var n = 100 fmt.Printf("%T\n", n) //数据类型 fmt.Printf("%v\n", n) //数值 fmt.Printf("%b\n", n) //转换为二进制 fmt.Printf("%o\n", n) //转换为八进制 fmt.Printf("%d\n", n) //转换为十进制 fmt.Printf("%x\n", n) //转换为十六进制 var s = "Lkaak" fmt.Printf("%s\n", s) //输出字符串 fmt.Printf("%#v\n", s) //输出字符串,#表示加上具体类型的描述符,字符串是# }
-
字符串
字符串底层是一个字符数组,属于值类型,所以能用比较符号直接对比。
//Go中的字符串是双引号,都是UTF-8编码,组成字符串的每个字符都是int-32类型 s := "Hello kaka" //Go中字符是单引号,表示单独的一个字母,汉字或字符 c1 := '1' c2 := 'k' c3 := '卡' //一个传统字符如数字和字母占一个字节ASCLL(8bit),汉字一般需要三个,utf-8
转义符 含义 \r
回车符(返回行首) \n
换行符(直接跳到下一行的同列位置) \t
制表符 \'
单引号 \"
双引号 \\
反斜杠 package main import ( "fmt" "strings" ) func main() { // \具有特殊含义,所以单纯使用时需要转义 path := "\"E:\\typora\\Typora\\GoNote\"" //对\和"前加上\进行转义输出 fmt.Println(path) //多行字符串,用反引号定义 s2 := `靠着单引号会靠在左边输出 靠在最左边输出与上面对齐 输出时前面会有空格` fmt.Println(s2) s3 := `'E:\typora\Typora\GoNote'` //反引号中会原样输出所以不用对\和'转义 fmt.Println(s3) //字符串长度 fmt.Println(len(s3)) //字符串拼接 x1 := "lkaak" x2 := "zq" // 因为底层是数组,所以能够按照数组的方式切割 x1 = x1[:3] fmt.Println(x1) x3 := x1 + x2 //使用+拼接字符串 fmt.Println(x3) x4 := fmt.Sprintf("%s%s", x1, x2) //使用两个占位符连接,然后sprintf可以把拼接结果返回给一个字符串保存,自己不会打印结果 fmt.Println(x4) // 字符串对比可以直接用== fmt.Println(x1 == x2) // fmt.Println("abc" == "abc") //字符串分割 ret := strings.Split(s3, "\\") fmt.Println(ret) //分割后结果放在切片里 fmt.Printf("%T", ret) //拼接 fmt.Println(strings.Join(ret, "+")) //用加号把字符数组的值拼接起来 //包含 fmt.Println(strings.Contains(x3, "lkaak")) fmt.Println(strings.Contains(x3, "zzzzz")) //判断前缀和后缀 fmt.Println(strings.HasPrefix(x3, "lk")) fmt.Println(strings.HasSuffix(x3, "zq")) //判断子串的位置 s4 := "abcdecd" fmt.Println(strings.Index(s4, "cd")) //第一个字符的位置 fmt.Println(strings.LastIndex(s4, "cd")) //字符串最后一次出现的位置 }
-
byte与rune类型及类型转换
Go语言的字符有两种类型,但是底层都是int类型,直接输出则是数字,需要用%c才能打印出原本字符
1.
uint8
类型,或者叫 byte 型,代表了ASCII码
的一个字符,占一个字节,但在Go中只用单引号的字母实际也用int32
表示(数字、字母),可以用byte强制转换为uint8
类型
2.rune
类型,代表一个UTF-8字符,实际上为int32
,占4个字节,第一个字节表示类型,后三个表示字符(中文,日文,复合字符)3.直接声明的字符(如’a’,‘卡’)还有按照for range遍历得到的字符都是rune类型,而按照顺序去遍历获取的都是byte类型字符,如s[0]
Go支持类型转换,但要能转换的才行,转换格式为
T(表达式)
,其中T为想要转换的类型,可以为单个的int
或数组[]int
package main import ( "fmt" ) func main() { s := "Hello卡卡" //字符串底层是byte数组,所以长度就是byte字节的长度 fmt.Println(len(s)) //5+3+3=11 //字符串遍历 //因为rune类型占了不止1个字节,所以按照次序遍历得到的结果是错误的 for i := 0; i < len(s); i++ { fmt.Printf("%c\n", s[i]) } //利用for range语法遍历的字符都是rune(int32)类型 for _, c := range s { fmt.Printf("%c\n", c) } //字符串修改 //字符串本身是不可以修改的,需要转换为[]byte或者[]rune,修改后再转为string,需要重新分配内存,并复制字节数组 s2 := "白萝卜" s3 := []rune(s2) //把字符串强制转换为了一个rune切片,类似一个字符数组,'白' '萝' '卜' s3[0] = '红' //修改第一个字符 fmt.Println(string(s3)) //把rune转换为字符串类型并输出 c1 := "红" c2 := '红' //rune fmt.Printf("c1:%T,c2:%T", c1, c2) //c2类型是int32,因为rune类型用int32表示,第一个字节表示是utf-8,后面三个字节表示这个字符 fmt.Println() c3 := 'A' //单引号直接声明byte类型,但也用int32位表示 c4 := byte('A') //转换为byte类型,用uint8 fmt.Printf("value:%d,type:%T,value:%d,type:%T", c3, c3, c4, c4) fmt.Println() //类型转换,支持字符串和rune,整数和float的转换 n := 10 //int f := float32(n) //对n强转换为float类型 fmt.Printf("%T", f) }
-
练习题
package main //统计字符串中的汉字的个数 //回文判断 import ( "fmt" "unicode" ) func main() { s := "Hello卡卡" n := 0 for _, c := range s { if unicode.Is(unicode.Han, c) { //使用Unicode.Is方法判断是否是汉字 n++ } } fmt.Printf("%d\n", n) //判断回文字符串 //先要转换为rune数组,因为字符串默认底层是byte(一个字节)数组,这样就会导致不能正确遍历rune(三个字节)类型的字符 ss := "上海自来水来自海上" sc := []rune(ss) flag := true i := 0 for j := len(sc) - 1; i < j; j-- { if sc[i] != sc[j] { flag = false break } i++ } fmt.Println(flag) }