Go数据类型详解
Go语言中有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有数组、切片、结构体、函数、map、通道(channel)等。Go语言的基本类型和其他语言大同小异。
一:整型
(一):进制
-
十进制
我们通常见的数字为10进制数,比如3,4等数字
i1 := 10
-
八进制
如果我们在十进制前面加上0则代表这个数为8进制数,比如03,04等,0后面的每一位数字最大不能超过7,比如08,068是不合法的
i2 := 077
-
十六进制
如果在10进制前面加上0x则代表16进制数,如0x3,0x4等,0x后面的每一位都不能超过f,比如0x2g是不合法的。
i3 := 0x123ea
(二):进制转换
%b代表二进制,%d表示10进制,%o代表八进制,%x代表十六进制
package main
import "fmt"
func main() {
// 定义10进制数
i1 := 101
fmt.Printf("i1=%d\n",i1) // --> 101
fmt.Printf("i1=%b\n",i1) // --> 1100101
fmt.Printf("i1=%o\n",i1) // --> 145
fmt.Printf("i1=%x\n",i1) // --> 65
}
(三):查看数据类型
无论是十进制还是其它进制,类型都为int类型,即整型。查看数据类型可使用 %T。
package main
import "fmt"
func main() {
// 定义10进制数
i1 := 101
fmt.Printf("i1=%b\n",i1)
fmt.Printf("%T\n",i1) // --> int
fmt.Printf("i1=%x\n",i1)
fmt.Printf("%T\n",i1) // --> int
}
二:浮点数
Go语言支持两种浮点类型:float32和float64。这两种浮点型数据格式遵循IEEE 754标准:float32的浮点数的最大范围约为3.4e38,可以使用常量定义:math.MaxFloat32;float的浮点数的最大范围约为1.8e308,可以使用一个常量定义:math.MaxFloat64.
打印浮点数时,可以使用fmt包配合动词%f,代码如下:
package main
import "fmt"
func main() {
f1 := 1.223344
fmt.Printf("%T\n",f) // Go中的小数类型默认都是float64类型
// 可强制转换为float32类型
f2 := float32(1.1234)
fmt.Printf("%T\n",f2)
}
注:上述代码中的f1和f2之间不能进行相互赋值,即不能进行f1=f2操作,因为float32与float64为两种完全不一样的数据类型,类型不同不能进行赋值操作。
四:布尔值
Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true和false两个值
注:
- 布尔类型变量的值默认为false
- Go语言中不允许将整型强制转换为布尔型
- 布尔型无法参与数值运算,也无法与其它类型进行转换
package main
import "fmt"
func main() {
bool1 := true
var bool2 bool
fmt.Printf("%T\n",bool1) // --> bool
fmt.Printf("%T\n",bool2) // --> bool
// %v可匹配任意类型的变量的值
fmt.Printf("bool1:%v\nbool2:%v",bool1,bool2) --> true,false
}
五:字符串
Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int,float,bool)一样。Go语言里的字符串的内部实现使用UTF-8编码。字符串的值为双引号中的内容,可以在Go语言的源码中直接添加非ASCII码字符。
扩展:字节,字符,字符串区别
- 1字节 = 8bit(8个二进制位),1个英文字符=1个字节,一个汉字一般占3个字节
- 字符串为字符的组合体,“a”,"我"这样的单独的字符,汉字或者符号称为字符,“asfa”则称为字符串
-
字符串转义符
转义符 含义 \r 回车符(返回行首) \n 换行符(直接跳到下一行的同列位置) \t 制表符 \’ 单引号 \" 双引号 \\ 反斜杠 -
多行字符串
Go语言中要定义一个多行字符串时,就必须使用反引号字符。反引号内的内容会原样输出,在反引号中使用的所有转义字符都将无效。
package main import "fmt" func main() { // 多行字符串,结果会原样输出 s := ` 我叫二狗\n 我今年18\t 我喜欢隔壁村的小芳 ` fmt.Println(s) }
输出结果如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfVih9h2-1608563542945)(C:\Users\Administrator\Desktop\第三阶段\GOlang\images\str.png)]
-
字符串常用操作
方法 介绍 len(str) 求长度 +或fmt.Sprintf 拼接字符串 strings.Split 分割 strings.contains 判断是否包含 strings.HasPrefix/strings.HasSuffix 开头/结尾判断 strings.Index()/strings.LastIndex() 子串第一个索引/最后一个索引 strings.Join([],sep string) join拼接操作 len()长度演示
package main import "fmt" func main() { // 多行字符串,结果会原样输出 s := ` 我叫二狗\n 我今年18\t 我喜欢隔壁村的小芳 ` fmt.Println(s) fmt.Println(len(s)) // -->63 }
+或fmt.Sprintf拼接演示
方式二与方式三的区别:方式二会直接将拼接后的内容打印出来,而方式三是将拼接的内容返回,需用一个变量来接受
package main import "fmt" func main() { // 字符串拼接操作 name := "kid" feature := "cool" fmt.Println(name + feature) // 方式一,用+号进行拼接 fmt.Printf("%s%s\n",name,feature) // 方式二,以格式化方式拼接 full := fmt.Sprintf("%s%s",name,feature) // 方式三,以Sprint方法拼接 fmt.Println(full) }
strings.Split分割演示
package main import "fmt" import "strings" func main() { // 字符串分割操作 path := `E:\Golang\src\github.com\dream_kid\day01\string` // 此处需对 \ 进行转义 result := strings.Split(path,"\\") fmt.Println(result) // --> [E: Golang src github.com dream_kid day01 string] }
strings.contains判断包含演示
package main import "fmt" import "strings" func main() { // 判断包含演示 str := `hello world` fmt.Println(strings.Contains(str,"hi")) // --> false }
strings.HasPrefix/strings.HasSuffix 开头/结尾判断
package main import "fmt" import "strings" func main() { // 开头结尾判断 fmt.Println(strings.HasPrefix(str,"he")) // --> true fmt.Println(strings.HasSuffix(str,"ll")) // --> false }
strings.Index()/strings.LastIndex() 子串索引判断
package main import "fmt" import "strings" func main() { ss := "adsfsfkjfs" // 出现子串的第一个索引位置 fmt.Println(strings.Index(ss,"s")) // --> 2 // 出现子串的最后一个索引位置 fmt.Println(strings.LastIndex(ss,"s")) // --> 9 }
strings.Join([],sep string) join拼接操作
package main import "fmt" import "strings" func main() { path := `E:\Golang\src\github.com\dream_kid\day01\string` result := strings.Split(path,"\\") fmt.Println(result) // --> [E: Golang src github.com dream_kid day01 string] // join fmt.Println(strings.Join(result,":")) // --> E::Golang:src:github.com:dream_kid:day01:string }
六:byte和rune类型
组成每个字符串的元素叫做字符,可以通过遍历或者单个获取字符串元素或得字符。字符是用单引号包裹起来的。在Go里字符与字符串是通过是双引号或单引号来进行严格区分的。
Go语言的字符有以下两种:
- uint8类型,或者叫byte型,代表了ASCII码的一个字符。
- rune类型,代表一个UTF-8字符
当需要处理中文,日文或者其它复合字符时,则需要用到rune类型。rune类型实际是一个int32。
当我们打印字符时,输出的是一个编码位置。
package main
import "fmt"
func main() {
w1 := "hello"
w2 := 'h' // ASCII码下,一个英文字母占一个字节(8bit)
fmt.Println(w1) // --> hello
fmt.Println(w2) // --> 104 (ASCII编码位置)
s1 := "北京"
s2 := '北' // UTF-8编码下一个中文占3个字节
fmt.Println(s1) // --> 北京
fmt.Println(s2) // --> 21271(utf8编码位置)
l := "hello北京"
// len返回的为字节的数量
fmt.Println(len(l)) // --> 11
}
七:修改字符串
要修改字符串,需要先将其转换为[]rune或[]byte,完成后再转换成string。无论哪种转换,都会重新分配内存,并赋值字节数组。
package main
import "fmt"
// 将北京改为南京
func main() {
wb := "北京" // '北' '京'
wn := []rune(wb) // ['北','京'] 把字符串强制转换成一个rune切片,切片中保存的是字符
wn[0] = '南' // 这里修改的是字符,所以一定要用单引号,不能使用双引号
fmt.Println(string(wn)) // 把rune切片强制转换成字符串
}
八:类型转换 (仅供了解)
只要整型和浮点型能够相互转换
package main
import "fmt"
func main() {
w := 10
var n float64
n = float64(w)
fmt.Printf("%T %f", n,n)
}
nc main() {
wb := “北京” // ‘北’ ‘京’
wn := []rune(wb) // [‘北’,‘京’] 把字符串强制转换成一个rune切片,切片中保存的是字符
wn[0] = ‘南’ // 这里修改的是字符,所以一定要用单引号,不能使用双引号
fmt.Println(string(wn)) // 把rune切片强制转换成字符串
}
### 八:类型转换 (仅供了解)
只要整型和浮点型能够相互转换
package main
import “fmt”
func main() {
w := 10
var n float64
n = float64(w)
fmt.Printf("%T %f", n,n)
}