go语言中数据类型:
- 整型
- 浮点型
- 布尔型
- 字符串
- 数组
- 切片
- 结构体
- 函数
- map
- 通道channel
- ...
整型分2大类:
图示:

- unit:没有指明位数,在32位系统就是uint32,在64位系统就是uint64
- int,在32位系统就是int32,在64系统就是int64
- uintptr,无符号整型,存放一个指针;
所以,考虑到不同平台的差异,最后明确指定位数的整型数据;
go1.13版本引入,方便以二进制、八进制、十六进制定义数字;
eg:
- v := 0b00101101 表示二进制101101,相当于十进制45
- v := 0o377表示二进制377,十进制的255
- v :=0x1p-2表示十六进制的1除以2的平方,相当于十进制0.25
- 使用_分隔数据
demo函数
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
|
package main
import "fmt"
func main() {
// 十进制
var a int = 10 // 定义一个十进制数10
fmt.Printf("%d \n", a) // 以十进制格式输出,还是10
fmt.Printf("%b \n", a) // 将10以二进制格式输出,就是1010
// 二进制 以0开头
var b int = 077
fmt.Printf("%o \n", b)
fmt.Printf("%d \n", b)
// 十六进制 以0x开头
var c int = 0xff
fmt.Printf("%x \n", c)
fmt.Printf("%X \n", c)
fmt.Printf("%d \n", c)
// %d 表示十进制格式
// %b 表示二进制格式
// %o 八进制而是
// %x 十六进制小写格式
// %X 十六进制大写格式
}
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
10
1010
77
63
ff
FF
255
|
go支持2种浮点型,float32和float64;
- float32范围:3.4e38,使用常量定义:math.MaxFloat32
- float64范围:1.8e308,使用常量定义:math.MaxFloat64
demo:
打印浮点数,%f是浮点数的格式占位符;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package main
import (
"fmt"
"math"
)
func main() {
fmt.Printf("%f\n", math.Pi) // 默认是取小数点后6位
fmt.Printf("%.2f\n", math.Pi)// .2表示取小数点后2位
}
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
3.141593
3.14
|
complex64和complex128,复数分为实部和虚部,complex64的实部和虚部都是64位,complex32则都是32位;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package main
import (
"fmt"
)
// 复数demo
func main() {
var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
fmt.Println(c1)
fmt.Println(c2)
}
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
(1+2i)
(2+3i)
|
布尔型bool,只有ture和fasle2个值,
- 默认是false
- go不允许将整型,强制类型转换为,布尔型
- 布尔型无法参于数据运算,无法和其他类型进行转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package main
import (
"fmt"
)
// bool demo
func main() {
var isOk bool
fmt.Println(isOk)
}
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
false
|
字符串是go语言中原生数据类型,go中字符串实现采用utf-8编码,所以go的字符串变量中可以填入“万国字符”——中文、英文、日文都中,其格式为外部有双引号。
1
2
|
s1 := "hello"
s2 := "你好"
|
go中常用转义符:
- \r 回车符,跳到下一行的行首
- \n 换行符,跳到下一行的同列位置
- \t 制表符
- '单引号
- "" 双引号
- \ 反斜杠
demo:打印windows下的文件路径:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package main
import (
"fmt"
)
// 字符串demo,并转义
func main() {
fmt.Println("str := \"c:\\Code\\lesson01\\go.exe\"")
}
// 打印时,像" 和 \ 这种特殊字符,需要前面加一个\进行转义
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
str := "c:\Code\lesson01\go.exe"
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package main
import (
"fmt"
)
// 多行字符串
func main() {
s1 := `
line1
line2
line3
`
fmt.Println(s1)
}
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
line1
line2
line3
|
- len(str)求长度
- +或fmt.Sprintf 拼接字符串
- strings.Split 分割
- strings.contains 判断是否包含
- strings.HasPrefix或strins.HasSuffix前缀或后缀判断
- strings.Index(),strings.LastIndex() 子串出现的位置,从前数,或从后数
- strings.Join(a[]string, sep string) join操作
组成字符串的每个元素:都叫做字符,如一个汉字、一个英文字母,一个日文、都是一个字符,注:不同字符所占据的字节是不同的;
通过遍历字符串,可获得其中的字符元素、字符用单引号包裹;
var a := "中"
var b := "Y"
go的字符有以下2种:
- uint8类型,或叫byte型,代表ascill码表的一个字符,
- rune类型,代表一个utf-8字符,**中文、日文、韩文、这种需要用到rune类型,rune本质是一个int32类型)
go使用rune类型处理unicode编码,更方便处理基于unicode的文件,若一个文件都是ascill字符,则可以使用byte类型做文本处理,更节省空间
demo:
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
|
package main
import (
"fmt"
)
// 遍历字符串demo
func main() {
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()
}
// s这个字符串,由字母和中文组成,中文在utf-i编码中有3到4个字节组成,而第一个遍历方式,全部以一个byte看做一个字符遍历,显然会把一个汉字的从字节切开,然后导致乱码
// 第二种遍历方式,以rune类型遍历,自然就是每次遍历一个字符,即便多种字符混合也可正常遍历,支持万国码
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
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(河)
|
字符串本质是一个byte数组,一个字符占据一个数组的下标,修改字符串步骤:
- 先将其转换为[]rune适合utf-8编码的字符串,或[]byte,适合纯ascill字符组成的字符串!
- 对字符串数据,中的字符元素,进行修改,利用数组下标
- 完成后再转为string
- 转换中,会重新分配内存,并复制字节数组
demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package main
import (
"fmt"
)
// 字符串修改demo
func main() {
s1 := "big"
bytes1 := []byte(s1) // 先转为字符串数组bytes1
bytes1[0] = 'p' // 对bytes1的0号元素,替换为p
// 注意赋值用等号= , 单个字符用''单引号
fmt.Println(string(bytes1)) // 再转回string类型
s2 := "白萝卜"
runes2 := []rune(s2) // 包含汉字,用[]rune做类型转换
runes2[0] = '红'
fmt.Println(string(runes2))
}
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
pig
红萝卜
|
go中,只有强制类型转换,没有隐式类型转换,只有2个类型数据,支持相互转换时,才可做类型转换;
语法:
T(表达式):T是要转换的类型,表达式可是:变量、复杂算子、函数返回值等
demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package main
import (
"fmt"
"math"
)
// 类型转换demo
func main() {
var a, b = 3, 4
var c int
c = int(math.Sqrt(float64(a*a + b*b)))
// math.Sqrt 函数接收的参数类型是float64类型,
// 所以,需要对内部计算表达式的结果做float64类型的转换
fmt.Println(c)
}
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
5
|
-
编写代码分别定义一个整型、浮点型、布尔型、字符串型变量,使用fmt.Printf()搭配%T分别打印出上述变量的值和类型。
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
|
package main
import (
"fmt"
)
// test1
func main() {
var num int = 10
var f1 float32 = 6.66
var isOk bool = true
var str string = "good good study"
fmt.Printf("%d, %T \n", num, num)
fmt.Printf("%.1f, %T \n", f1, f1)
fmt.Println(isOk)
fmt.Printf("%T \n", isOk)
fmt.Println(str)
fmt.Printf("%T \n", str)
}
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
10, int
6.7, float32
true
bool
good good study
string
|
-
编写代码统计出字符串"hello沙河小王子"中汉字的数量
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
|
package main
import (
"fmt"
)
// test2
// 先转换为rune数组,然后遍历数组的字符元素,
// 遍历时,字符元素再转换为string类型,并利用len函数求其长度,
// 若长度大于或等于3,则是汉字,计数值加1
func main() {
s1 := "hello沙河小王子溜溜溜"
numOfHanzi := 0
runes1 := []rune(s1)
for i := 0; i < len(runes1); i++ {
if len(string(runes1[i])) >= 3 {
numOfHanzi++
}
}
fmt.Printf("the num of hanzi is : %d", numOfHanzi)
}
D:\workstation\mycode\gocode\src\learngo\basic_grammar\03_data_type>03_data_type.exe
the num of hanzi is : 8
|