1. 程式人生 > 其它 >21天從Java轉向Go之第四天——水滴石穿(基本資料)

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

布林

聚合型別

陣列

結構體

引用型別

指標

slice

map

函式

通道