21天从Java转向Go之第四天——水滴石穿(基本数据)

Go语言中的数据类型

  • 基础类型

  • 聚合类型

  • 引用类型

  • 接口类型

基础类型

数字

整数

  • 有符号整数
    -- int8 int16 int32 int64 int
  • 无符号整数
    -- uint8 uint16 uint32 uint64 uint
  • int uint 位数取决于编译器32位或64位
  • byte类型 同unit8类型
  • rune类型 同int32类型
  • uintptr ,用于底层编程,大小不明确,足以完整存放指针。

浮点数

  • float32
  • float64
  • math包 math.IsNaN()

复数

  • complex64
  • complex128
	c := complex(1, 2)
	r := real(c)
	i := imag(c)
	fmt.Printf("实部:%f虚部:%f\n",r,i)

字符串

  • 字符串是不可变的字节序列,可以包含任意数据,包括0值字节。文本字符串被解读成按UTF-8的Unicode码点(文字符号)。
  • len(string)函数 返回字节数,使用下标访问,返回得到第i个字符。0《= i <len(s)
s := "你好,hello 世界 プログラム"
	fmt.Println("字节数:",len(s))//37
	fmt.Println("前三个字符:",s[0],s[1],s[2],s[3])// 228 189 160 229
		fmt.Println(s[len(s)]) //panic: runtime error: index out of range [37] with length 37

  • 加号(+)连接俩个字符串生成一个新的字符串,+=生成新的字符串
	s+="123"
	fmt.Println(s) //你好,hello 世界 プログラム123
  • 字符串不可改变,字符串内部的数据不允许修改。不可变意味着两个字符串可以安全地共用同一段底层内存,使得复制任何长度字符串的开销都低廉。
s[0] = 'L' //编译错误:s[0]无法赋值
//s[7:]与s共用底层字节数组
  • 字符串字面量双引号形式 和 原生字面量`` 原生字符串字面量可以展开多行,唯一特殊处理是回车符会被删除。
  • unicode 囊括了世界上所有文书体系的全部字符,对它们各自赋予一个叫Unicode码点的标准数字。在Go语言中,这些字符记号被称为文字符号(rune)。天然适合保存单个文字符号的数据类型就是int32,为Go所采用;正因如此,rune类型作为int32类型的别名。我们可以将文字符号的序列表示出int32值序列,每个unicode码点的编码长度相同,都是32位。这种编码简单划一,可是因为大多数面向计算机的可读文本是ASCII码,每个字符只需要8位,也会是1个字节,导致了不必要的存储空间消耗,而使用广泛的字符数目也少于65556个,字符用16位就能容纳。我们能作改进吗?
  • UTF-8
    UTF-8以字节为单位对Unicode码点作变长编码。UTF-8是现行的一种Unicode标准,由Go的两位创建者Ken Thompson和Rob Pike发明。每个文字符号用1~4个字节表示,ASCII字符的编码仅占1个字节,其他文书字符的编码是2或3个字节。一个文字符号编码的首字节的高位指明了后面还有多少字节。若最高位是0,标示着它是7位的ASCII码,其文字符号的编码仅占1字节,这就与传统的ACSII码一致。若最高几位是110,则文字符号的编码占用2个字节,第二个字节以10开始。更长的编码以此类推。
    变长编码的字符串无法按下表直接访问第n个字符,然而有时有得,UTF-8换来许多有用的特性。最多追溯3字节,就能定位一个字符的起始位置。UTF-8是前缀编码,因此能从左向右解码而不产生歧义,也无须超前预读。
  • unicode包提供了对单个文字符号的函数
  • unicode/utf8包则提供了按UTF-8编码和解码文字符号的函数。
package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	s := "你好,hello 世界 プログラム"
	fmt.Println("字节数:",len(s))//37
	fmt.Println("前三个字符:",s[0],s[1],s[2],s[3])// 228 189 160 229
	//fmt.Println(s[len(s)]) //panic: runtime error: index out of range [37] with length 37

	s+="123"
	fmt.Println(s)
//s=	``
//	fmt.Println(s)

	fmt.Println(utf8.RuneCountInString(s)) //返回 string s 中的 UTF-8 编码的码值的个数。

	for i, i2 := range s { //隐式
		fmt.Println("for range:",i,i2)
	}

	for i := 0; i < len(s); {
		inString, size := utf8.DecodeRuneInString(s[i:])  //解码 string s 中第一个 UTF-8 编码序列,返回该码值和长度。
		i+=size
		fmt.Println(inString,size)
		fmt.Println(string(inString))
	}

	runes := []rune(s)
	fmt.Println(runes)

	fmt.Println(string(runes))
}

  • 4个标准包对字符串操作特别重要 bytes strings strconv unicode

布尔

聚合类型

数组

结构体

引用类型

  • 当声明引用类型的变量时,创建的变量被称作标头(header)值。从技术细节上说,字符串也是一种引用类型。每个引用类型创建的标头值是包含一个指向底层数据结构的指针。每个引用类型还包含一组独特的字段,用于管理底层数据结构。因为标头值是为复制而设计的,所以永远不需要共享一个引用类型的值。标头值里包含一个指针,因此通过复制来传递一个引用类型的值的副本,本质上就是在共享底层数据结构。

指针

slice

map

函数

通道

posted @ 2021-11-27 13:16  永恒之光  阅读(77)  评论(0编辑  收藏  举报