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两个值
注:
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码字符。
扩展:字节,字符,字符串区别
字符串转义符
转义符 | 含义 |
---|---|
\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
}
组成每个字符串的元素叫做字符,可以通过遍历或者单个获取字符串元素或得字符。字符是用单引号包裹起来的。在Go里字符与字符串是通过是双引号或单引号来进行严格区分的。
Go语言的字符有以下两种:
当需要处理中文,日文或者其它复合字符时,则需要用到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)
}