Go | 基本資料型別詳解

2022-10-22 18:01:21

前言

基本資料型別,變數存的就是值,也叫值型別。每一種資料都定義了明確的資料型別,在記憶體中分配了不同大小的記憶體空間。

Printf 和 Println 的區別

  • printf 輸出後不換行, println輸出後自動換行;

  • printf 格式化輸出,println 直接輸出內容

  • Printf 根據format引數生成格式化的字串並寫入標準輸出。

判斷資料型別以及檢視變數使用記憶體空間

package main

// import "unsafe"
// import "fmt"
// 引入多個
import (
"fmt"
"unsafe"
)

func main() {
	var i int8 = 12
	fmt.Println("i= ", i)

	var i2 uint8 = 129
	fmt.Println("i2= ", i2)

	var n = 12
	fmt.Printf("n的型別是%T\n", n) // n的型別是int

	var name = "xiao"
	fmt.Printf("name的型別是%T\n", name) // name的型別是string

	// 檢視變數佔用的位元組大小和資料型別
	fmt.Printf("name的型別是%T", name, unsafe.Sizeof(name))
}

基本資料型別

數值型

整數型別 (預設值是0)

int, int8, int16, int32, int64
uint, uint8, uint16, uint32, uint64 無符號數(表示的範圍更大)
byte

  • bit: 計算機中的最小儲存單位

  • byte: 計算機中基本儲存單元

  • 1byte = 8bit (一個位元組8位元)

var i int8 = -129

// constant -129 overflows int8

var i2 uint8 = -129
// constant -129 overflows uint8

浮點型別 (預設值是0)

  • float32

  • float64(預設型別)

浮點數 = 符號位 + 指數位 + 尾數位

浮點數都是有符號

使用浮點型別的時候就需要注意存在丟失精度的問題

var num1 float32 = 12.556883123132   // 精度會丟失
var num2 float64 = 12.556883123132   // 64位元比32位元精度要準確
fmt.Println("num1=", num1, "num2", num2) // num1= 12.556883 num2 12.556883123132

var num = 12.64
fmt.Printf("num的型別", num) // num的型別%!(EXTRA float64=12.64)

var num3 = 5.6e2   //  5.6 * 10^2 = 5.6 * 100 = 560
fmt.Println("num3=", num3)

字元型

沒有專門的字元型,使用byte來儲存單個字母字元

ASCII碼(128個)

  • Go語言的字元使用UTF-8編碼

  • 英文字母:1個位元組

  • 漢字:3個位元組

  • 字元必須使用單引號括起來,雙引號會報錯

單引號針對單個字元,字串要使用雙引號

UTF-8是對ASCII的擴容

var str1 byte = 'a'
var str2 byte = '0'

// 當直接輸出byte時,輸出的使對應字元的ASCII碼值(十進位制)
fmt.Println("str1", str1, "str2", str2) // str1 97 str2 48
fmt.Printf("str1=%c str2=%c", str1, str2) // str1=a str2=0

fmt.Printf("str1=%c", str1) // str1=a
fmt.Printf("str2=%c", str2) // str2=0


var name byte = '吖'
fmt.Printf("name=%c", name) // overflows byte 超出byte型別的儲存範圍了

// 漢字更換成int型別
var name int = '吖'
fmt.Printf("name=%c", name) // name=吖

var name1 int =22269
fmt.Printf("name1=%c", name1) // name1=國

// 資料型別只是為了定義儲存空間的大小,對應計算機中的記憶體空間

布林型(bool)(預設值是false)

用於邏輯運算,流程控制。bool型別只佔用一個位元組的記憶體空間

var a = false
fmt.Println(a)  // false
fmt.Println(unsafe.Sizeof(a))  // 1

字串(string)(預設值是"")

UTF-8編碼

字串一經定義,則不能修改

var address string = "北京長城"
fmt.Println(address) // 北京長城

var str = "hello"
str[0] = 'a'     // cannot assign to str[0] (strings are immutable)
fmt.Println(str)

// 反引號
// 以字串原生形式輸出,包括換行和特殊字元,可以實現防止攻擊、輸出原始碼等效果。

// 字串拼接, + 號要放在上面,否則會報錯(因為go預設在一行後面加;號)
var str01 = "hello" + " world"
str01 += "  haha!" + "xixi" +
"heihei"
fmt.Println(str01)    // hello world  haha!xixiheihei

基本資料型別的預設值

var a int
var b float32
var c float64
var d bool
var e string

// %v表示按照變數的值輸出
fmt.Printf("a=%d,b=%v,c=%v,d=%v e=%v", a,b,c,d,e)

上面輸出: a=0,b=0,c=0,d=false e=

派生/複雜資料型別

  1. 指標(Pointer)

  2. 陣列

  3. 結構體(struct)

  4. 管道(Channel)

  5. 函數

  6. 切片(slice)

  7. 介面(interface)

  8. map

後面陸續講解複雜資料型別。


我是 甜點cc

熱愛前端,也喜歡專研各種跟本職工作關係不大的技術,技術、產品興趣廣泛且濃厚,等待著一個創業機會。本號主要致力於分享個人經驗總結,希望可以給一小部分人一些微小幫助。

希望能和大家一起努力營造一個良好的學習氛圍,為了個人和家庭、為了我國的網際網路物聯網技術、數位化轉型、數位經濟發展做一點點貢獻。數風流人物還看中國、看今朝、看你我。