整型

特殊整型

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
}

浮点型(more)

Go语言支持两种浮点型数:float32float64。这两种浮点型数据格式遵循IEEE 754标准: float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32float64 的浮点数的最大范围约为 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

  1. 布尔类型变量的默认值为false。
  2. Go 语言中不允许将整型强制转换为布尔型.
  3. 布尔型无法参与数值运算,也无法与其他类型进行转换。

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))
}

类型转换(more)

练习题

  • 编写代码分别定义一个整型、浮点型、布尔型、字符串型变量,使用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)
    }

知识文档