【Go】开始使用Go-微软入门教程笔记

 

基本数据类型

数组(array)

// 数组可具有零个或多个元素,你必须在声明或初始化它们时定义大小。
// 此外,它们一旦创建,就无法调整大小。 鉴于这些原因,数组在 Go 程序中并不常用,但它们是切片和映射的基础。

cities := [5]string{"New York", "Paris", "Berlin", "Madrid"}
// 数组长度这里为5
q := [...]int{1, 2, 3}
// 不确定数组长度时, 使用省略号...初始化
cities := [...]string{"New York", "Paris", "Berlin", "Madrid"}
// 数组长度由你初始化它时输入的字符串决定, 这里为4
numbers := [...]int{99: -1}
// 指在99位置初始化值为1. 这里数组长度为100

var twoD [3][5]int
// 多维数组

 

 

切片(slice)

  • 声明和初始化

  切片只有 3 个组件:

  • * 指向基础数组中第一个可访问元素的指针。 此元素不一定是基础数组的第一个元素  array[0] 。
  • length 切片的长度。 切片中的元素数目。
  • capacity 切片的容量。切片容量仅指出切片可扩展的程度,即切片开头基础数组尾端之间的元素数目。

  从切片  quarter2 创建扩展切片,如下例所示

// 要声明切片,可采用与声明数组相同的方式操作。
package main

import "fmt"

func main() {
months := []string{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
fmt.Println(months)
fmt.Println("Length:", len(months)) // len = 切片的实际长度
fmt.Println("Capacity:", cap(months)) // cap = len(months) - 开始位置i

// 与array的第一个区别是切片的大小不是固定的,而是动态的。 创建切片后,可向其添加更多元素,这样切片就会扩展
quarter2 := months[3:6] // len(quarter2) = 3; cap(quarter2) = 12 - 3 =9
quarter2Extended := quarter2[:4] // len(quarter2Extended) = 4; cap(quarter2Extended) = 9
}

 

  注意, 长度与容量的区别:切片长度指切片实际包含的元素数量;切片容量指切片可扩展的程度。

  在上例中,切片长度为 3 个元素,但容量为 9,原因是基础数组有更多元素或位置可供使用,但对切片而言不可见。 例如,如果你尝试打印类似  fmt.Println(quarter2[3]) 的内容,会出现以下错误: panic: runtime error: index out of range [3] with length 3 。

 

  • 创建切片的副本

  Go 具有内置函数  copy(dst, src []Type)  用于创建切片的副本。 例如:

letters := []string{"A", "B", "C", "D", "E"}

slice2 := make([]string, 3)
copy(slice2, letters[1:4])

  为何要创建副本? 因为更改非副本切片中的元素时,基础数组将随之更改。

  注意, copy之后, 切片不会继承基础数组的capacity.

 

字符串遍历

source: Go 语言中的字符与字符串遍历 - 知乎 (zhihu.com)

  • byte (字节)是 uint8 的别名,长度为 1 个字节,用于表示 ASCII 字符
  • rune 是 int32 的别名,长度为 4 个字节,用于表示以 UTF-8 编码的 Unicode 码点

Tips:

Unicode 和 ASCII 一样,是一种字符集,UTF-8 则是一种编码方式.

Unicode 从 0 开始,为每个符号指定一个编号,这叫做「码点」(code point).

UTF-8 是一种变长的编码方法,字符长度从 1 个字节到 4 个字节不等, 其中一个汉字占用3个字节.

总结:

  • Go 语言中没有字符的概念,一个字符就是一堆字节,它可能是单个字节(ASCII 字符集),也有可能是多个字节(Unicode 字符集). 
  • 字符串的截取 numeral[i:j] , 以及下标索引字符串 numeral[i] , 都是以字节为单位
  • 想要遍历 rune 类型的字符则使用 range 方法进行遍历  for index, digit := range numeral {} 
posted @ 2021-10-25 17:37  Raylan  阅读(221)  评论(0)    收藏  举报