类型名称 类型和描述
int/uint 无符号整型和带符号整型内存大小相等,具体大小取决于编译器实现。
int8、int16、int32(rune)、int64和uint8(byte)、uint16、uint32、uint64。
rune是int32的别称,byte是uint8的别称。
8位整型占1字节,16位整型占2字节,32位整型占4字节,64位整型占8字节。
float32/float64 长度分别为4字节8字节,float64为默认类型。
complex64、complex128为两个复数类型,其中
complex64类型带有float32实部和虚部,complex128类型带有float64实部和虚部
string 默认使用UFT-8编码标识Unicode文本
boolean true或者false,例如 var b bool = true 。类型长度为 1 字节
派生类型 切片类型slice字典map通道channel指针pointer数组array
结构化struct函数function接口interface错误error
它们内部结构复杂,不仅需要申请内存,还需要初始化相关属性

整型

浮点型

字符与字符串

连接字符串

加号连接字符串,由于编译器行尾自动补全分号,加号必须放在第一行

字符串遍历

  1. func main() {
  2. s := "我是中国人"
  3. for i := 0; i < len(s); i++ {
  4. fmt.Printf("%c", s[i]) // 乱码,因为一字节无法显示为一个完整的字符
  5. }
  6. for i := 0; i < len(s); i++ {
  7. fmt.Printf("%d = %v\n", i, s[i]) // 输出单个字节值
  8. }
  9. fmt.Print("\n")
  10. for _, v := range s {
  11. fmt.Printf("%c", v) // 我是中国人
  12. }
  13. fmt.Print("\n")
  14. }

字符串修改

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. // 修改字符串中的字节
  7. s := "Hello 世界!"
  8. b := []byte(s) // 转换为 []byte,自动复制数据
  9. b[5] = ',' // 修改[]byte
  10. fmt.Printf("s: %s\n", s) //Hello 世界!s不能被修改,内容保持不变
  11. fmt.Printf("b: %s\n", b) //Hello,世界!修改后的数据
  12. // 修改字符串中的字符
  13. r := []rune(s) // 转换为 []rune,自动复制数据
  14. r[6] = '中' // 修改 []rune
  15. r[7] = '国' // 修改 []rune
  16. fmt.Printf("s: %v\n", s) // s: Hello 世界!s不能被修改,内容保持不变
  17. fmt.Println(string(r)) // Hello 中国!转换为字符串,又一次复制数据
  18. }

strings包

  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. "unicode/utf8"
  6. )
  7. func main() {
  8. str := "This is an example of a string"
  9. // 1. 包含
  10. fmt.Printf("%t\n", strings.HasPrefix(str, "Th")) // 开头
  11. fmt.Printf("%t\n", strings.HasSuffix(str, "string")) // 结尾
  12. fmt.Printf("%t\n", strings.Contains(str, "example")) // 包含
  13. // 2. 索引
  14. fmt.Printf("%d\n", strings.Index(str, "of")) // 顺序第一个匹配字符的索引
  15. fmt.Printf("%d\n", strings.LastIndex(str, "of")) // 逆序第一个匹配字符的索引
  16. fmt.Printf("%d\n", strings.IndexRune(str, 'f')) // 如果是非ASCII编码的字符,用该函数对字符定位
  17. // 3. 替换
  18. fmt.Println(strings.Replace(str, "string", "int", 1)) // 第4个参数表示匹配到第几个,如果是-1,则代表匹配所有
  19. // 4. 统计
  20. fmt.Printf("%d\n", strings.Count(str, " ")) // 匹配空格出现的频率
  21. fmt.Printf("%d\n", len([]rune(str))) // 统计字符串长度
  22. fmt.Println(utf8.RuneCountInString(str)) // 统计字符串长度
  23. // 统计字符串长度推荐第二种,但是如果只是单纯统计,没有用到utf8的其它函数,倒也没必要把这个utf8包引入
  24. // 5. 大小写转换
  25. fmt.Printf("%s\n", strings.ToLower(str)) // 转小写 this is an example of a string
  26. fmt.Printf("%s\n", strings.ToUpper(str)) // 转大写 THIS IS AN EXAMPLE OF A STRING
  27. // 6. 修剪
  28. fmt.Printf("%q\n", strings.Trim("今天天气真好", "今天")) // "气真好" Trim函数会把第二个参数转为rune类型,进而逐一匹配替换,即“今天”被分为两个字符分别替换
  29. fmt.Printf("%q\n", strings.TrimLeft("今天天气真好", "今天")) // "气真好"
  30. fmt.Printf("%q\n", strings.Trim(" !!! Golang !!! ", "! ")) // "Golang"
  31. fmt.Printf("%q\n", strings.Trim(" !!! Golang !!! ", " ! ")) // "Golang"
  32. fmt.Printf("%q\n", strings.Trim(" !!! Golang !!! ", "!")) // " !!! Golang !!! "
  33. fmt.Printf("%q\n", strings.TrimLeft(" !!! Golang !!! ", "! ")) // "Golang !!! "
  34. fmt.Printf("%q\n", strings.TrimLeft(" !!! Golang !!! ", " ! ")) // "Golang !!! "
  35. fmt.Printf("%q\n", strings.TrimLeft(" !!! Golang !!! ", "!")) // " !!! Golang !!! "
  36. fmt.Printf("%q\n", strings.TrimSpace(" \t\n 这是\t一句话 \n\t\r\n\v ")) // "这是\t一句话" 修剪掉两侧水平制表符\t、垂直制表符\v、换行\n、回车\r
  37. // 7. 分割
  38. fmt.Printf("%q\n", strings.Split("a,b,c", ",")) // ["a" "b" "c"]
  39. fmt.Printf("%q\n", strings.Split("a boy a girl a dog a cat", "a ")) // ["" "boy " "girl " "dog " "cat"]
  40. fmt.Printf("%q\n", strings.Split("xyz", "")) // ["x" "y" "z"]
  41. // 8. 插入字符
  42. str = "The quick brown fox jumps over the lazy dog 中文"
  43. strSli := strings.Fields(str)
  44. fmt.Printf("%s\n", strSli) // [The quick brown fox jumps over the lazy dog 中文]
  45. for _, val := range strSli {
  46. fmt.Printf("%s ", val) // The quick brown fox jumps over the lazy dog 中文
  47. }
  48. fmt.Println()
  49. str2 := strings.Join(strSli, ";")
  50. fmt.Printf("%s\n", str2) // The;quick;brown;fox;jumps;over;the;lazy;dog;中文
  51. // bytes.Buffer 也可以连接字符
  52. }

strconv包

用于string和其它类型之间的转换

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. func main() {
  7. orig := "233"
  8. fmt.Printf("%T %d\n", orig, strconv.IntSize) //string 64 字符串类型,大小64
  9. num, _ := strconv.Atoi(orig) // num, _ := strconv.Atoi(orig) string > int
  10. fmt.Printf("num: %v\n", num) // num: 233
  11. num += 5
  12. newS := strconv.Itoa(num) // 十进制数字 > string
  13. fmt.Printf("newS: %v\n", newS) // newS: 238
  14. a, _ := strconv.ParseFloat(orig, 32) // string > float32
  15. fmt.Printf("a: %v\n", a) // a: 233
  16. b, _ := strconv.ParseFloat(orig, 64) // string > float64
  17. fmt.Printf("b: %v\n", b) // b: 233
  18. }

字符串格式化

格式化指令 含义
%% %字面量
%b 一个二进制整数,将一个整数格式化为二进制的表达方式
%c 一个Unicode字符
%d 十进制数值
%0 八进制整数
%x 小写的十六进制数
%X 大写的十六进制数
%U 一个Unicode表示法表示的整型码值,默认是4个数字字符
%s 输出以原生的UTF-8字节表示的字符,如果console不支持UTF-8编码,则乱码
%t 以true或false的方式输出布尔值
%v 使用默认格式输出值,或者如果方法存在,则使用类型的String()方法输出的自定义值
%T 输出值的类型

布尔型

基本数据类型的扩展