作用
告诉编译器这个数据(变量)应该以多大内存空间存储
关于类型
- 编译器要求:每个值必须在经过编译后属于某个类型(因为go是静态类型语言)
- 自定义类型:新类型不会拥有原基础类型所附带的方法(新的类型,方法需要重新创建)
基础类型
详情
类型 | 名称 | 长度 | 零值 | 说明 |
---|---|---|---|---|
bool | 布尔类型 | 1 | false | 其值不为真即为家,不可以用数字代表true或false |
byte | 字节型 | 1 | 0 | uint8别名 |
rune | 字符类型 | 4 | 0 | 专用于存储unicode编码,等价于uint32 |
int, uint | 整型 | 4或8 | 0 | 32位或64位 |
int8, uint8 | 整型 | 1 | 0 | -128 ~ 127, 0 ~ 255 |
int16, uint16 | 整型 | 2 | 0 | -32768 ~ 32767, 0 ~ 65535 |
int32, uint32 | 整型 | 4 | 0 | -21亿 ~ 21 亿, 0 ~ 42 亿 |
int64, uint64 | 整型 | 8 | 0 | |
float32 | 浮点型 | 4 | 0.0 | 小数位精确到7位 |
float64 | 浮点型 | 8 | 0.0 | 小数位精确到15位 |
complex64 | 复数类型 | 8 | ||
complex128 | 复数类型 | 16 | ||
uintptr | 整型 | 4或8 | ⾜以存储指针的uint32或uint64整数 | |
string | 字符串 | “” | utf-8字符串,注意字符串的零值是 “” |
unicode 编码集(规定了字符的数字编码) UTF8 为 unicode 的具体实现方案之一(规定了数字编码的实际存储方案)
bool
bool只有两个值,
- true
- false
注意: 整形无法做类型转换,成为 bool
package main
import "fmt"
func main() {
c := bool(1)
fmt.Println("c := ", c)
}
输出
D:\projects\gocode\go100\breakdemo
λ go run main.go
# command-line-arguments
.\main.go:7:11: cannot convert 1 (type untyped int) to type bool
字符串
字符串就是一串固定长度的字符连接起来的字符序列。 go的字符串是由单个字节连接起来的。go语言的字符串的字节是使用 utf8 编码的 unicode文本
- 使用双引号
- 字符串可以有一个或者多个字符组成
- 字符串都是隐藏了一个结束符
\0
- 支持原字符
x4F60 x597D , x4E16 x754C;
编码参考 unicode utf8 ascii https://www.zhihu.com/question/23374078
func main() {
str := "你好,世界" // 你好,世界
fmt.Printf("str len is: %d\n", len(str))
}
// str len is: 13
utf8编码介绍
utf8编码规则
根据上表,解读 UTF-8 编码非常简单。如果一个字节的第一位是0
,则这个字节单独就是一个字符;如果第一位是1
,则连续有多少个1
,就表示当前字符占用多少个字节。
下面,还是以汉字严
为例,演示如何实现 UTF-8 编码。严
的 Unicode 是4E25
(100111000100101
),根据上表,可以发现4E25
处在第三行的范围内(0000 0800 - 0000 FFFF
),因此严
的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx
。然后,从严
的最右边二进制位开始,依次从右往左填入上边格式中的x
,多出的位补0
。这样就得到了,严
的 UTF-8 编码是11100100 10111000 10100101
,转换成十六进制就是E4 B8 A5
。
例子
func TestStringToRune(t *testing.T) {
s := "中华人民共和国"
for _, c := range s {
t.Logf("%[1]c %[1]x", c)
}
}
// output:
// 中 4e2d
// 华 534e
// 人 4eba
// 民 6c11
// 共 5171
// 和 548c
// 国 56fd
字符与字符串区别
如下代码
import "fmt"
func main() {
var ch byte
var str string
ch = 'a'
fmt.Println(ch)
str = "a"
fmt.Println(str)
}
/*output
97
a
*/
type 关键字
Type关键字在Go中作用非常重要,比如:
- 定义结构体
- 定义接口
- 自定义类型
- 定义类型别名
自定义类型由一组值以及作用于这些值的方法组成,类型一般有类型名称,往往从现有类型组全通过type关键字构造出来一个新的类型
复杂类型
stuct
package main
import (
"fmt"
)
func main() {
type Person struct{}
var p Person
fmt.Printf("p type is : %T, value is: %v", p, p)
}
输出
D:\projects\gocode\go100\breakdemo
λ go run main.go
p type is : main.Person, value is: {}