2 基本数据类型
2 基本数据类型
整型、浮点型、布尔型、字符串
数组、切片、结构体、函数、map、通道等
2.1 整型
分为两个大类:
- 长度:
int8,int16,int32,int64int16: short类型int64: long 类型
- 无符号:
uint8,uint16,uint32,uint64uint8:byte型
2.1.1 特殊整型
- 特殊整型
uint: 32为操作系统上是uint32int: 32位操作系统上是int32uintptr: 无符号整型,用于存放一个指针
- 注意:使用
int和uint需要考虑不同平台的差异 - 注意:获取对象的长度的内建
len()函数,返回的长度可以根据不同的平台的字节长度变化- 实际使用中,切片或map元素数量可以用
int表示 - 涉及二进制传输、读写文件的结构描述时,不要使用
int和uint
- 实际使用中,切片或map元素数量可以用
2.1.2 数字字面量语法(Number literals syntax)
便于开发者以二进制、八进制、十六进制浮点数的格式 定义数字
v := 0b001: 二进制的001v := 0o77: 八进制的77v := 0xff: 十六进制的ff
允许使用_分隔数字:v := 12_3
允许开发者使用相应的占位符以二进制%b、八进制%o、十进制%d、十六进制%x输出:
- 由以上两个性质,我们可以将任意进制数字 以任意进制形式输出
示例:
1 | package main |
浮点型
两种浮点型:都遵循IEEE 754标准
float32: 最大范围3.4e38, 可使用常量定义:math.MaxFloat32float64:最大范围1.8e308,math.MaxFloat64
打印浮点数,使用占位符%f
1 | package main |
复数
两种:都由 实部与虚部 组成各占一半
complex64: 实部未 32 位,虚部为 32 位complex128
示例:
1 | package main |
布尔型
bool 型两个值:true 、 false
==注意:==
- 默认值:
false - 不允许将整型强制转换为bool
- bool 无法参与数值运算,无法与其他类型转换
字符串
Go 中的字符串以原生数据类型出现
- 注意:Go 语言的字符串内部实现使用
UTF-8编码 - 字符串的值为 双引号 中的内容
- 可以在Go的源码中直接添加非
ASCII码字符s1 := "hello"s2 := "你好"
字符串转义符
| 转义符 | 含义 |
|---|---|
| \r | 回车符(返回行首 |
| \n | 换行符(直接跳到下一行的同列位置 |
| \t | 制表符 |
\' |
单引号 |
\" |
双引号 |
\\ |
反斜杠,例如文件路径 |
多行字符串
Go 定义一个多行字符串,必须使用反引号` 字符:
1 | s := `line1 |
字符串常用操作
| 方法 | 介绍 |
|---|---|
| len(str) | 求长度 |
+ 或者 fmt.Sprintf |
拼接字符串 |
| strings.Split | 分割 |
| strings.contains | 判断是否包含 |
| strings.HasPrefix, strings.HasSuffix | 前缀/后缀判断 |
| strings.Index(), strings.LastIndex() | 字串出现的位置 |
| strings.Join(a[]stirng, sep string) | join操作 |
byte 和 rune 类型
字符串的每个元素是 字符 ,字符用单引号包裹
可以通过 遍历 或 单个获取字符串元素 获得字符
Go 的字符 有两种:
uint8, 或叫byte型,代表ASCII码的一个字符int32, 或叫rune类型,代表一个UTF-8码的一个字符处理中文、日文或者其他符合字符:用到
rune类型,实际上是一个int32Go 使用特殊的 rune 类型处理 Unicode,让基于Unicode的文本处理更方便,也可以使用byte型进行默认字符串处理,性能和扩展性都有照顾:
示例:
```Go
package mainimport “fmt”
func main() {
s := "hello, 世界" //byte for i := 0; i < len(s); i++ { fmt.Printf("%v %c\n", s[i], s[i]) } //rune for _, r := range s { fmt.Printf("%v %c\n", r, r) }}
1
2
3
* 输出:104 h
101 e
108 l
108 l
111 o
44 ,
32
228 ä
184 ¸
150
231 ç
149
140
104 h
101 e
108 l
108 l
111 o
44 ,
32
19990 世
30028 界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
* ==注意:==
* `UTF-8` 编码下 一个汉字,由三至四个字节组成,所以不能简单按照字节去遍历 一个包含汉子的字符串
* rune 用来表示`UTF-8`字符,一个rune 字符由一个或多个byte组成
* ==字符串底层==:一个`byte`数组,所以可以和`[]byte`类型相互转换
* 字符串是==不能 直接修改== 的
* ==字符串长度==:`byte`数组的长度
* `for _,r := range s`
*
#### 修改字符串
* 需要将字符串转换成`[]rune`或`[]byte`
* 在转换成`string`
* 转换,都会重新分配内存,并复制字节数组
* 示例
* ```go
package main
import "fmt"
func main() {
s := "hello world"
//强制类型转换
bytes := []byte(s)
bytes[0] = 'p'
fmt.Println(string(bytes))
s2 := "你好,世界"
runes2 := []rune(s2)
runes2[0] = '我'
fmt.Println(string(runes2))
}
`
类型转换
Go 中只有 强制类型转换,无 隐式类型转换
只在两个类型之间支持相互转换的时候使用
语法:
T(expression)- T: 要转换的的类型
- 表达式:包括变量、复杂算子、函数返回值等
Sqrt 所接受的参数是
float64类型示例:
- ```go
package mainimport (
)func main() {"fmt" "math"
}var a, b = 3, 4 var c int c = int(math.Sqrt(float64(a*a + b*b))) fmt.Println(c)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
### 练习题
#### 练习一
* 编写代码分别定义一个整型、浮点型、布尔型、字符串型变量,使用`fmt.Printf()`搭配`%T`分别打印出上述变量的值和类型
* ```Go
package main
import "fmt"
func main() {
s := "hello"
i := 10
f := 3.14
var b bool = true
fmt.Printf("%s %T\n", s, s)
fmt.Printf("%d %T\n", i, i)
fmt.Printf("%f %T\n", f, f)
fmt.Printf("%t %T\n", b, b) \\bool 的占位符:`%t`
}
- ```go
练习二
编写代码统计出字符串
"hello沙河小王子"中汉字的数量。package main import "fmt" func main() { s := "hello沙河小王子" count := 0 for _, i := range s { //range if len(string(i)) > 1 { // count++ } } fmt.Println(count) }
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment









