D 的个人博客

但行好事莫问前程

  menu
417 文章
3446695 浏览
3 当前访客
ღゝ◡╹)ノ❤️

Go 边看边练 -《Go 学习笔记》系列(二)

上一篇: [1437497122181]


ToC


1.3 基本类型

更明确的数字类型命名,支持 Unicode,支持常用数据结构。

类型 长度 默认值 说明
bool 1 false
byte 1 0 uint8
rune 4 0 Unicode Code Point, int32
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
float64 8 0.0
complex64 8
complex128 16
uintptr 4 或 8 足以存储指针的 uint32 或 uint64 整数
array 值类型
struct 值类型
string "" UTF-8 字符串
slice nil 引用类型
map nil 引用类型
channel nil 引用类型
interface nil 接口
function nil 函数

支持八进制、十六进制,以及科学记数法。标准库 math 定义了各数字类型取值范围。

1a, b, c, d := 071, 0x1F, 1e9, math.MinInt16

空指针值 nil,而非 C/C++ NULL。

1.4 引用类型

引用类型包括 slicemapchannel。它们有复杂的内部结构,除了申请内存外,还需要初始化相关属性。

内置函数 new 计算类型大小,为其分配零值内存,返回指针。而 make 会被编译器翻译成具体的创建函数,由其分配内存和初始化成员结构,返回对象而非指针。

1a := []int{0, 0, 0} // 提供初始化表达式。
2a[1] = 10
3
4b := make([]int, 3) // makeslice
5b[1] = 10
6
7c := new([]int)
8c[1] = 10 // Error: invalid operation: c[1] (index of type *[]int)

有关引用类型具体的内存布局,可参考后续章节。

1.5 类型转换

不支持隐式类型转换,即便是从窄向宽转换也不行。

1var b byte = 100
2// var n int = b // Error: cannot use b (type byte) as type int in assignment
3var n int = int(b) // 显式转换

使用括号避免优先级错误。

1*Point(p) // 相当于 *(Point(p))
2(*Point)(p)
3<-chan int(c) // 相当于 <-(chan int(c))
4(<-chan int)(c)

同样不能将其他类型当 bool 值使用。

1a := 100
2if a { // Error: non-bool a (type int) used as if condition
3	println("true")
4}

1.6 字符串

字符串是不可变值类型,内部用指针指向 UTF-8 字节数组。

  • 默认值是空字符串 ""。
  • 用索引号访问某字节,如 s[i]
  • 不能用序号获取字节元素指针,&s[i] 非法。
  • 不可变类型,无法修改字节数组。
  • 字节数组尾部不包含 NULL

runtime.h

1struct String
2{
3	byte* str;
4	intgo len;
5};

使用索引号访问字符 (byte)。

1s := "abc"
2println(s[0] == '\x61', s[1] == 'b', s[2] == 0x63)

输出:

1true true true

使用 "`" 定义不做转义处理的原始字符串,支持跨行。

1s := `a
2b\r\n\x00
3c`
4
5println(s)

输出:

1a
2b\r\n\x00
3c

连接跨行字符串时,"+" 必须在上一行末尾,否则导致编译错误。

1s := "Hello, " +
2"World!"
3
4s2 := "Hello, "
5+ "World!" // Error: invalid operation: + untyped string

支持用两个索引号返回子串。子串依然指向原字节数组,仅修改了指针和长度属性。

1s := "Hello, World!"
2s1 := s[:5] // Hello
3s2 := s[7:] // World!
4s3 := s[1:5] // ello

单引号字符常量表示 Unicode Code Point,支持 \uFFFF\U7FFFFFFF\xFF 格式。对应 rune 类型,UCS-4。

要修改字符串,可先将其转换成 []rune[]byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。

for 循环遍历字符串时,也有 byterune 两种方式。

下一篇: [1437719712835]



社区小贴士

  • 关注标签 [golang] 可以方便查看 Go 相关帖子
  • 关注标签 [Go 学习笔记] 可以方便查看本系列
  • 关注作者后如有新帖将会收到通知

该文章同步自 黑客派