整型
特殊整型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package main import "fmt" func main() { // 十进制 var a int = 10 fmt.Printf("%d \n", a) // 10 fmt.Printf("%b \n", a) // 1010 占位符%b表示二进制 // 八进制 以0开头 var b int = 077 fmt.Printf("%o \n", b) // 77 // 十六进制 以0x开头 var c int = 0xff fmt.Printf("%x \n", c) // ff fmt.Printf("%X \n", c) // FF }
Go语言支持两种浮点型数:float32
和float64
。这两种浮点型数据格式遵循IEEE 754标准: float32
的浮点数的最大范围约为 3.4e38
,可以使用常量定义:math.MaxFloat32
。float64
的浮点数的最大范围约为 1.8e308
,可以使用一个常量定义:math.MaxFloat64
。
打印浮点数时,可以使用fmt包配合动词%f
,代码如下:
1 2 3 4 5 6 7 8 9 package main import ( "fmt" "math" ) func main() { fmt.Printf("%f\n", math.Pi) fmt.Printf("%.2f\n", math.Pi) }
复数
了解即可,用于科学计算领域
complex64和complex128
1 2 3 4 5 6 var c1 complex64 c1 = 1 + 2i var c2 complex128 c2 = 2 + 3i fmt.Println(c1) fmt.Println(c2)
复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。
bool
布尔类型变量的默认值为false。
Go 语言中不允许将整型强制转换为布尔型.
布尔型无法参与数值运算,也无法与其他类型进行转换。
string Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用UTF-8
编码。 字符串的值为双引号(")
中的内容,可以在Go语言的源码中直接添加非ASCII码字符,例如:
1 2 s1 := "hello" s2 := "你好"
字符串转义符
Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示。
转义符
含义
\r
回车符(返回行首)
\n
换行符(直接跳到下一行的同列位置)
\t
制表符
'
单引号
"
双引号
\
反斜杠
举个例子,我们要打印一个Windows平台下的一个文件路径:
1 2 3 4 5 6 7 package main import ( "fmt" ) func main() { fmt.Println("str := \"c:\\Code\\lesson1\\go.exe\"") }
多行字符串:
Go语言中要定义一个多行字符串时,就必须使用反引号字符:
1 2 3 4 5 s1 := `第一行 第二行 第三行 ` fmt.Println(s1)
反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
字符串常用操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 package main // 声明一个包,表示当前是一个可执行程序 import ( // 导入内置的fmt包 "fmt" "strings" ) // 字符串常用操作 func main() { // main函数,程序执行的入口 // 求字符串的长度 s1 := "hello" fmt.Println(len(s1)) // 5 s2 := "hello beijing" fmt.Println(len(s2)) // 11 // 拼接字符串 fmt.Println(s1 + s2) s3 := fmt.Sprintf("%s - %s", s1, s2) // hello - hello beijing fmt.Println(s3) // 字符串的分割 s4 := "how do you do" fmt.Println(strings.Split(s4, " ")) // [how old are you] fmt.Printf("%T\n", strings.Split(s4, " ")) // 切割之后的数据类型 []string // 判断是否包含 fmt.Println(strings.Contains(s4, "do")) // 判断前缀 fmt.Println(strings.HasPrefix(s4, "how")) // 返回bool true // 判断后缀 fmt.Println(strings.HasSuffix(s4, "how")) // 返回bool false // 判断子串的位置 fmt.Println(strings.LastIndex(s4, "do")) // 最后子串出现的位置 fmt.Println(strings.LastIndex(s4, "do")) // join s5 := []string{"how", "do", "you", "do"} fmt.Println(s5) // [how do you do] fmt.Println(strings.Join(s5, "+")) // how+do+you+do }
byte 和 rune Go 语言的字符有以下两种:
uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
rune类型,代表一个 UTF-8字符。
当需要处理中文、日文或者其他复合字符时,则需要用到rune
类型。rune
类型实际是一个int32
。
1 2 3 4 5 6 7 8 9 10 11 12 // 遍历字符串 func traversalString() { s := "hello沙河" for i := 0; i < len(s); i++ { //byte fmt.Printf("%v(%c) ", s[i], s[i]) } fmt.Println() for _, r := range s { //rune fmt.Printf("%v(%c) ", r, r) } fmt.Println() }
输出:
1 2 104(h) 101(e) 108(l) 108(l) 111(o) 230(æ) 178(²) 153() 230(æ) 178(²) 179(³) 104(h) 101(e) 108(l) 108(l) 111(o) 27801(沙) 27827(河)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package main import "fmt" func main() { // byte unit8的别名 ASCII码 // rune int32的别名 var c1 byte = 'c' var c2 rune = 'c' fmt.Println(c1, c2) fmt.Printf("c1:%T c2:%T", c1, c2) s := "hello 北京" for i := 0; i < len(s); i++ { fmt.Printf("%c\n", s[i]) } fmt.Printf("-------\n") for _,r := range s { fmt.Printf("%c\n", r) } }
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 99 99 c1:uint8 c2:int32h e l l o å ä º ¬ ------- h e l l o 北 京
修改字符串 要修改字符串,需要先将其转换成[]rune
或[]byte
,完成后再转换为string
。无论哪种转换,都会重新分配内存,并复制字节数组。
1 2 3 4 5 6 7 8 9 10 11 12 func changeString() { s1 := "big" // 强制类型转换 byteS1 := []byte(s1) byteS1[0] = 'p' fmt.Println(string(byteS1)) s2 := "白萝卜" runeS2 := []rune(s2) runeS2[0] = '红' fmt.Println(string(runeS2)) }
练习题
编写代码分别定义一个整型、浮点型、布尔型、字符串型变量,使用fmt.Printf()搭配%T分别打印出上述变量的值和类型。1 2 3 4 5 6 7 8 9 10 11 func main() { a := 11 var b float64 = 3.14 c := true d := "boy" fmt.Println("值:类型") fmt.Printf("%d:%T\n", a, a) fmt.Printf("%v:%T\n", b, b) fmt.Printf("%v:%T\n", c, c) fmt.Printf("%v:%T\n", d, d) }
编写代码统计出字符串”hello 房山小王子”中汉字的数量。1 2 3 4 5 6 7 8 9 10 11 12 13 func main() { s := "hello 房山小王子" count := 0 for _, v := range s { fmt.Printf("%v: %T\n", v, v) // fmt.Println(string(v)) fmt.Println(len(string(v))) if len(string(v)) >= 3 { count++ } } fmt.Println("汉字数量", count) }
知识文档 :