一、基本数据类型
1. 整型
uint8
也就是byte
型
无符号整型 | 取值范围 |
---|---|
uint8 |
0 到 255 |
uint16 |
0 到 65535 |
uint32 |
0 到 4294967295 |
uint64 |
0 到 18446744073709551615 |
int16
对应C语言中的short
型,int64
对应C语言中的long
型
有符号整型 | 取值范围 |
---|---|
int8 |
-128 到 127 |
int16 |
-32768 到 32767 |
int32 |
-2147483648 到 2147483647 |
int64 |
-9223372036854775808 到 9223372036854775807 |
a. 特殊整型
在使用int
和uint
类型时,不能假定它是32位或64位的整型,而是考虑int
和uint
可能在不同平台上的差异。
特殊整型 | 描述 |
---|---|
uint |
32位操作系统上就是uint32,64位操作系统上就是uint64 |
int |
32位操作系统上就是int32,64位操作系统上就是int64 |
uintptr |
无符号整型,长度被设定为足够存放一个指针 |
b. 数字字面量语法
const a = 0b00001101 // 二进制1101 == 十进制13
const b = 0333 // 0333 == 0o333,八进制333 == 十进制 64 * 3 + 3 * 8 + 3 = 219
const c = 0xAF // 十六进制AF == 十进制 10 * 16 + 15 = 175
2. 浮点型
-
float32
精确到小数点后7位,最大范围可以使用常量定义:math.MaxFloat32
-
float64
精确到小数点后15位,最大范围可以使用常量定义:math.MaxFloat64
。并且尽可能地使用float64
,因为math
包中所有有关数学运算的函数都会要求接收这个类型 - 使用
==
或者!=
来比较浮点数时应当非常小心,最好在正式使用前测试对于精确度要求较高的运算
3. 复数
复数使用re+imI
来表示,其中re
代表实数部分,im
代表虚数部分,I
代表根号负1
-
complex64
,32位实数和虚数 -
complex128
,64位实数和虚数;最好使用complex128
作为计算类型,因为相关函数都使用这个类型的参数。
var c1 complex64 = 5 + 10i // 5 + 10i == complex(5, 10)
fmt.Printf("输出:%v", c1) // 输出:5+10i
4. 布尔值
布尔型数据只有true
和false
两个值,默认为false
5、字符串
字符串是一种值类型,且值不可变,更深入地讲,字符串是byte类型
的固定长度数组。
Go语言支持以下2种形式字符串:
-
解释字符串
该类字符串使用双引号括起来,其中的相关的转义字符将被替换,这些转义字符包括:
-
\n
:换行符 -
\r
:回车符 -
\t
:tab 键 -
\u
或\U
:Unicode字符 -
\\
:反斜杠自身 -
\'
:单引号 -
\"
:双引号
-
-
非解释字符串
该类字符串使用反引号括起来,支持换行,例如:
package main import "fmt" func main() { const a = `\n:这里不会换行 这里才会` // `\n:这里不会换行 // 这里才会` 作为一个完整的字符串原样输出 fmt.Println(a) }
字符串拼接符+
a := "我是A" + ",我5岁"
a += ",身高180cm"
fmt.Println(a) // 我是A,我5岁,身高180cm
字符:byte
和rune
类型
组成每个字符串的元素叫做字符,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号'
包裹起来。
Go语言的字符有以下两种:
-
uint8
类型,或者叫byte
型,代表了ASCII码
的一个字符 -
rune
类型,代表一个UTF-8
字符,rune
类型实际是一个int32
Go语言使用了特殊的rune
类型来处理Unicode,让基于Unicode的文本处理更为方便,也可以使用byte
型进行默认字符串处理,性能和扩展性都有照顾。
s := "byte,no,rune我是"
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()
// 98(b) 121(y) 116(t) 101(e) 44(,) 110(n) 111(o) 44(,) 114(r) 117(u) 110(n) 101(e) 230(æ) 136() 145() 230(æ) 152() 175(¯)
// 98(b) 121(y) 116(t) 101(e) 44(,) 110(n) 111(o) 44(,) 114(r) 117(u) 110(n) 101(e) 25105(我) 26159(是)
因为UTF-8
编码下一个中文汉字由3~4个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。
字符串底层是一个byte
数组,所以可以和[]byte
类型相互转换。字符串是不能修改的,字符串是由byte
组成,所以字符串的长度是byte
的长度。rune
类型用来表示utf-8
字符,一个rune
字符由一个或多个byte
组成。
二、类型转换
Go语言中只有强制类型转换,没有隐式类型转换。
a, b := 3, 4
var c int
// math.Sqrt()接收的参数是float64类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c) // 5
参考文献
有疑问加站长微信联系(非本文作者)