基本数据类型包含:整型、浮点型、布尔类型以及字符串,这几种数据类型在几乎所有的编程语言中都支持。

1、整数类型

具体类型 计算过程 取值范围
int8 -27 到 27-1 -128 到127
uint8 2**8-1 0到255
int16 -215 到 215-1 -32768到32767
unit16 2**16-1 0到65535
int32 -231到231-1 -2147483648到2147483647
unit32 2**32-1 0到4294967295
int64 -263 到 263-1 -9223372036854775808到9223372036854775807
unit64 2**64-1 0到18446744073709551615
uint 与平台相关,32位操作系统上就是 uint32,64位操作系统上就是uint64
int 与平台相关,32位操作系统上就是 int32,64位操作系统上就是int64
  1. // mac 上执行
  2. var x int
  3. x = 100
  4. fmt.Println(x, reflect.TypeOf(x)) // 查看数据类型 reflect.TypeOf(变量)
  5. //输出
  6. 100 int
  1. // 测试超出数据范围
  2. var x int8
  3. x = 300
  4. fmt.Println(x)
  5. //输出报错
  6. constant 300 overflows int8

2、进制转换

  1. // 十进制转化
  2. var a int = 10
  3. fmt.Println("%d \n", a) //10 占位符 %d 表示十进制
  4. fmt.Println("%b \n", a) //1010 占位符 %b 表示二进制
  5. fmt.Println("%o \n"a) //12 占位符 %o 表示八进制
  6. fmt.Println("%x \n", a) //a 占位符 %x 表示十六进制
  7. // 八进制转换
  8. var b int = 020
  9. fmt.Printf("%o \n", b) // 20
  10. fmt.Printf("%d \n", b) // 16
  11. fmt.Printf("%x \n", b) // 10
  12. fmt.Printf("%b \n", b) // 10000
  13. //十六进制转换
  14. var c int = ox12
  15. fmt.Printf("%d \n", c) // 18
  16. fmt.Printf("%o \n", c) // 22
  17. fmt.Printf("%x \n", c) // 12
  18. fmt.Printf("%b \n", c) // 10010

3、浮点型

float类型

float类型分为 float32 和 float64 两种类型,这两种浮点型数据格式遵循 IEEE 754 标准。

类型 最大值 最小非负数
float32 3.402823466385288598117041834516925440e +38 1.401298464324817070923729583289916131280e -45
float64 1.797693134862315708145274237317043567981e +308 4.940656458412465441765687928682213723651e -324
  1. // 正常输出
  2. var f1 float32
  3. f1 = 3.14
  4. fmt.Println(f1,reflect.TypeOf(f1)) //3.14 float32
  5. var f2 float64
  6. f2 = 3.14
  7. fmt.Println(f2,reflect.Typeof(f2)) //3.14 float64
  8. f3 := 3.14
  9. fmt.Println(f3,reflect.Typeof(f3)) //3.14 float64 默认是 64
  1. //格式化输出
  2. f1 := 3.1415926
  3. fmt.Printf("f1:%f !",f1, reflect.TypeOf(f1))//默认保留6位
  4. // 打印结果
  5. f1:3.141593 !%!(EXTRA *reflect.rtype=float64) // 第6位值是根据第7位的大小4舍五入
  6. // 只保留3位格式化输出
  7. f1 := 3.1415926
  8. fmt.Printf("f1:%.3f !",f1) // f1:3.142 !

科学计数表示

  1. 科学计数是我们经常用的,那生活中我们一般怎么弄呐:
  2. 2000 => 2 * (10**3)
  3. 0.003 => 3 * (10**-3)

4、布尔类型

布尔类型是最基本的数据类型之一,只有两个值:true 和 false,分别代表逻辑判断中的真和假,主要应用在条件判断中。

  1. fmt.Println(1==1) // true
  2. fmt.Println(2<1) // false
  3. fmt.Println(2>1) // true
  4. b := 3 > 1
  5. fmt.Println(b,reflect.TypeOf(b)) //true bool

5、字符串

字符串是最基本也是最常用的数据类型,是通过双引号将多个字符按串联起来的一种数据,用于展示文本。

  1. // 只有 双引号 "" 表示字符串
  2. var name = "hello sbhong"
  3. fmt.Println(name, reflect.TypeOf(word)) // hello sbhong. string
  4. // 单引号 '' 表示单个字符
  5. var world = 'h'
  6. fmt.Println(word, reflect.TypeOf(word))
  7. // 输出结果
  8. 104 int32 //104:字节数,表示字节

索引和切片

字符串在内存中是一段连续存储空间
3.3、基本数据类型 - 图1

索引是从0开始计数的,不支持负索引

  1. name := "hello yuan"
  2. fmt.Println(name) // hello yuan
  3. // 索引取值
  4. var v = name[1] // 101 => 字节数,表示字节
  5. var m = string(name[1]) // e => 通过string函数强制转成 字符串
  6. // 负索引取值,不支持
  7. var v = name[-1] // invalid string index -1 (index must be non-negative)
  1. // 切片 => 数据对象[start:end]
  2. name := "hello yuan"
  3. // 切片取值 slice[start:end] => 顾头不顾尾
  4. a := name[2:5]
  5. fmt.Printf(a) // llo
  6. // 顾头又顾尾,当 end 缺省,起始位到整个连续区域末尾
  7. b := name[2:]
  8. fmt.Printf(b) // llo yuan
  9. // 当开始位缺省默认为 start 默认为0
  10. c := name[:5]
  11. fmt.Printf(c) // hello

字符串拼接

Go语言字符串拼接 是通过 + 号方式拼接

  1. // 字符串拼接
  2. firstName := "hello "
  3. lastName := "word"
  4. fullName := firstName + lastName //通过 + 号拼接生成一个新的字符串
  5. fmt.Println(fullName)

转义字符

  1. 转义字符用 \ 表示
  2. \ 后面跟一个普通符号可以赋予这个普通符号特殊功能。eg: \n
  3. \ 后面跟一个特殊符号,转义符号会将其变成普通符号。 eg:\

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示:

转义符 含义
\r 回车符(返回行首)
\n 换行符(直接跳到下一行的同列位置)
\t 制表符(相当于tab键)
\‘ 单引号
\“ 双引号
\\ 反斜杠

举个例子:

  1. package main
  2. import "fmt"
  3. func main(){
  4. fmt.Println("str := \"c:\\Code\\lesson01\\go.exe\"")
  5. }
  6. // 打印结果
  7. str := "c:\Code\lesson01\go.exe"

打印多行字符串

Go语言里面要定义个多行字符串,就必须使用 反引号(``) 字符:

  1. myHobby := `
  2. 第一行语句
  3. 第二行语句
  4. ....
  5. `
  6. fmt.Println(myHobby)

反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

格式化输出

格式化输出,只能用 fmt.Printf() 函数打印

  1. // 整形和浮点型
  2. fmt.Printf("%b\n", 12) // 二进制表示:1100
  3. fmt.Printf("%d\n", 12) // 十进制表示:12
  4. fmt.Printf("%o\n", 12) // 八进制表示:14
  5. fmt.Printf("%x\n", 12) // 十六进制表示:c
  6. fmt.Printf("%X\n", 12) // 十六进制表示:c
  7. fmt.Printf("%f\n", 3.1415) // 有小数点而无指数:3.141500
  8. fmt.Printf("%.4f\n", 3.1415) // 3.1415
  9. fmt.Printf("%.3f\n", 3.1415) // 3.142
  10. fmt.Printf("%e\n", 1000.25) // 科学计数法: 1.000250e+03
  11. // 根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的0)输出: 3.1415
  12. fmt.Printf("%g\n", 3.1415)
  13. // 布尔占位符
  14. fmt.Printf("%t\n", true)
  15. // 字符串
  16. fmt.Printf("my name is %s,my age is %d","sgg",18)
  17. // 打印数据类型 %T
  18. fmt.Printf("%T", true) //bool
  19. fmt.Printf("%T", 10) // int
  20. /*用的比较多 %v 不知道要插入类型值,这个时候就要插进去
  21. 这个时候就用%v,不管什么类型都能插入进去。*/
  22. name,age := "hello qigao", 22
  23. fmt.Printf("%v",name) // hello qigao
  24. fmt.Printf("%v",age) // 22

字符串常用方法

方法 介绍
len(str) 求长度
strings.Split 分割
strings.contains 判断是否包含:返回bool类型
strings.HasPrefix/strings.HasSuffix 前缀/后缀判断:返回bool类型
strings.Index()/stringsLastIndex() 字符串出现的位置
strings.Join(a[] string, sep string) Join 操作 :与Split 配合使用
  1. names := "sbh,sgg,xhz"
  2. // 1. len(str) 求字符串的长度
  3. namesLen := len(names)
  4. fmt.Println(namesLen) // 11
  5. //2. 分割:strings.Split,想看Split 入参条件:command + Split 看源码
  6. namesData := strings.Split(names, ",")
  7. fmt.Println(namesData, reflect.TypeOf(namesData))
  8. // 打印结果,返回数据格式
  9. [sbh sgg xhz] []string
  10. //3. strings.contains:是否包含
  11. ret := strings.Contains(names, "sbh")
  12. fmt.Println(ret, reflect.TypeOf(ret)) //true bool
  13. // strings.Join(a[] string, sep string):Join 操作 :与Split 配合使用
  14. namesData := []string{"sbh","sgg","xhz"}
  15. name := strings.Join(namesData,":")
  16. fmt.Println(name) //sbh:sgg:xhz
  17. //strings.HasPrefix/strings.HasSuffix:前缀/后缀判断:返回bool类型
  18. names := "sbh,sgg,xhz"
  19. ret := strings.HasPrefix(names, "sbh") // 以sbh为前缀
  20. fmt.Println(ret) // true
  21. ret := strings.HasSuffix(names, "xhz") // 以xhz为后缀
  22. fmt.Println(ret) // true
  23. //strings.Index()/stringsLastIndex() : 字符串出现的位置
  24. names := "sbh,sgg,xhz"
  25. ret := strings.Index(names, "s") // s出现的第一个位置
  26. fmt.Println(ret) // 0
  27. ret := strings.LastIndex(names, "s") // s出现最后一个位置
  28. fmt.Println(ret) // 4

6、类型转换

Go语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。

  1. // go 语言,强类型,无法做到暗转换
  2. s := "hello word"
  3. fmt.Println(s + 2) // 会报错,两个不同的数据类型
  4. // js 语言,弱类型,可以做到暗转换
  5. var s = "hello" + 11
  6. console.log(s) // hello11

强制类型转换的基本语法如下:

  1. Type(表达式)

其中,Type表示要转换的类型。表达式包括变量、复杂算子和函数返回值。

  1. // 把数字转换成对应的ASCII码
  2. x := 100
  3. fmt.Print(string(x)) //d
  4. x := 65
  5. fmt.Print(string(x)) //A
  6. // 数字转换为字符串: strconv.Itoa(x)
  7. x := 65
  8. fmt.Println(strconv.Itoa(x), reflect.TypeOf(strconv.Itoa(x)))
  9. //字符串转换为整型,浮点不行: strconv.Atoi()
  10. x := "100"
  11. y,_ := strconv.Atoi(x)
  12. fmt.Println(strconv.Atoi(x)) // 100 <nil> => nil 表示 空值,相当月 null
  13. fmt.Println(y,reflect.TypeOf(y)) // 100 int