Go語言學習筆記(1) - Golang 變量的基本使用與基本類型

特別注意 : Go 語言中任何導入的包或者創建的變量如果不使用的話,會報錯 ! 所以一旦你導入了某個包或者創建了某個變量就一定要使用, 否則的話會報錯, 編譯也不會通過

一. 變量的快速入門

Go語言是靜態類型語言,因此變量(variable)是有明確類型的,編譯器也會檢查變量類型的正確性

1.1 創建第一個變量

package main

import ("fmt")

func main()  {
	
	// 創建變量的第一種方式
	var a int
	var b int = 10
	
	fmt.Println(a)
	fmt.Println(b)
}
// 結果 
0
10

需要注意的是,Go語言和許多編程語言不同,它在聲明變量時將變量的類型放在變量的名稱之後。這樣做的好處就是可以避免像C語言中那樣含糊不清的聲明形式,例如:int* a, b; 。其中只有 a 是指針而 b 不是。如果你想要這兩個變量都是指針,則需要將它們分開書寫。而在 Go 中,則可以和輕鬆地將它們都聲明爲指針類型:

二. 創建變量的兩種方式

2.1 標準格式 : 使用 var 創建

package main

import ("fmt")

func main()  {
	
	// 創建變量的第一種方式
	var a int
	// 創建時賦初始值
	var b int = 10
	// 批量創建
	var (
		a1 int = 12
		a2 string ="aaa"
	)
	// 創建時讓編譯器自動識別類型
	var a3 = 12

	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(a1)
	fmt.Println(a2)
	fmt.Println(a3)

	// 創建變量的第二種方式

}

2.2 簡易格式 : 變量名 := 初始值

package main

import ("fmt")

func main()  {
	
	// 創建變量的第二種方式
	c := 1
	// 同時創建多個變量
	d1,d2 := 12,"cc"

	fmt.Println(c)
	fmt.Println(d1)
	fmt.Println(d2)

}

因爲簡潔和靈活的特點,簡短變量聲明被廣泛用於大部分的局部變量的聲明和初始化。var 形式的聲明語句往往是用於需要顯式指定變量類型地方,或者因爲變量稍後會被重新賦值而初始值無關緊要的地方

2.3 Go變量使用注意事項

  • 當一個變量被聲明之後,系統自動賦予它該類型的零值:int 爲 0,float 爲 0.0,bool 爲 false,string 爲空字符串,指針爲 nil 等。所有的內存在 Go 中都是經過初始化的。
  • 變量的命名規則遵循駱駝命名法,即首個單詞小寫,每個新單詞的首字母大寫,例如:numShips 和 startDate
  • 一般使用簡易格式創建變量

2.4 + 號的使用

  • 當兩邊都是數值型時, 做加法運算
  • 當兩邊是字符串時, 做字符拼接操作

三. 變量的基本類型

3.1 字符類型 string

	// 1.string
	str := "哈哈哈哈哈"
	fmt.Println(str)

就是基本的字符串類型. 注意 : string 是基本類型, 大小默認是 16字節 (不是很確定! ) 在別的語言中 比如 Java中string 並不是一個基本類型, 但是在 GO中 string是基本類型

注意 : 在使用 string 類型的時候, 如果使用 var 定義的時候不賦初值 則默認值是 “” 也就是空字符串

3.2 Bool 類型

這個就是基本的 布爾類型

	//2. bool
	boolearn := true
	fmt.Println(boolearn)

**

3.3 整數類型

(1) 有符號整數 int
**
Go 語言中沒有 short ,long 類型 , 取而代之的是 int , int8 int16 , int32 , int64 類型
int 默認與 本機的位數是一樣的, 比如我的電腦是 64位的, int 就是 64位也就是 8字節大小的
int8 後面的 8是指 8 位 , 也就是一個字節 大小範圍就是 -128 ~ 127 ,其他以此類推

package main

import (
	"fmt"
	"math"
	"unsafe"
)

func main(){

	//3. int 默認與當前主機的位數有關 , 比如我的電腦是 64位的 , 則 int 就是64位的
	var i   int   = math.MaxInt64
	// 1個字節的 整數類型, int8 後面的8是指 8位 
	var i8  int8  = math.MaxInt8
	// 2個字節的 整數類型 16指 16位
	var i16 int16 = math.MaxInt16
	var i32 int32 = math.MaxInt32
	var i64 int64 = math.MaxInt64

	fmt.Println(i)
	fmt.Println(i8)
	fmt.Println(i16)
	fmt.Println(i32)
	fmt.Println(i64)

	fmt.Println("int 類型的字節大小 :", unsafe.Sizeof(i))
}

(2) 無符號整數 uint
**
無符號整數所有的位都作爲數值位, 所以沒有負數 , 和 有符號整數相比基本類型, 區別是取值範圍
比如 uint8 類型的數 取值範圍是 0 255 , int8 類型數 取值範圍是 -128 ~ 127

package main

import (
	"fmt"
	"math"
)

func main(){

	var ui uint = math.MaxUint64
	var ui8 uint8 = math.MaxUint8
	var ui16 uint16 = math.MaxUint16
	var ui32 uint32 = math.MaxUint32
	var ui64 uint64 = math.MaxUint64

	fmt.Println(ui)
	fmt.Println(ui8)
	fmt.Println(ui16)
	fmt.Println(ui32)
	fmt.Println(ui64)
}

3.4 整數類型注意事項 [重要]

  • Go語言的數值類型分爲以下幾種:整數、浮點數、複數,其中每一種都包含了不同大小的數值類型,例如有符號整數包含 int8、int16、int32、int64 等,每種數值類型都決定了對應的大小範圍和是否支持正負符號。本節我們主要介紹一下整數類型。

  • Go語言同時提供了有符號和無符號的整數類型,其中包括 int8、int16、int32 和 int64 四種大小截然不同的有符號整數類型,分別對應 8、16、32、64 bit(二進制位)大小的有符號整數,與此對應的是 uint8、uint16、uint32 和 uint64 四種無符號整數類型。

  • 此外還有兩種整數類型 int 和 uint,它們分別對應特定 CPU 平臺的字長(機器字大小),其中 int 表示有符號整數,應用最爲廣泛,uint 表示無符號整數。實際開發中由於編譯器和計算機硬件的不同,int 和 uint 所能表示的整數大小會在 32bit 或 64bit 之間變化。

  • 大多數情況下,我們只需要 int 一種整型即可,它可以用於循環計數器(for 循環中控制循環次數的變量)、數組和切片的索引,以及任何通用目的的整型運算符,通常 int 類型的處理速度也是最快的。

  • 用來表示 Unicode 字符的 rune 類型和 int32 類型是等價的,通常用於表示一個 Unicode 碼點。這兩個名稱可以互換使用。同樣,byte 和 uint8 也是等價類型,byte 類型一般用於強調數值是一個原始的數據而不是一個小的整數。

  • 最後,還有一種無符號的整數類型 uintptr,它沒有指定具體的 bit 大小但是足以容納指針。uintptr 類型只有在底層編程時才需要,特別是Go語言和C語言函數庫或操作系統接口相交互的地方。

  • 儘管在某些特定的運行環境下 int、uint 和 uintptr 的大小可能相等,但是它們依然是不同的類型,比如 int 和 int32,雖然 int 類型的大小也可能是 32 bit,但是在需要把 int 類型當做 int32 類型使用的時候必須顯示的對類型進行轉換,反之亦然。

  • Go語言中有符號整數採用 2 的補碼形式表示,也就是最高 bit 位用來表示符號位,一個 n-bit 的有符號數的取值範圍是從 -2****** 到 2********-1。無符號整數的所有 bit 位都用於表示非負數,取值範圍是 0 到 2********。例如,int8 類型整數的取值範圍是從 -128 到 127,而 uint8 類型整數的取值範圍是從 0 到 255。**

3.5 浮點數類型

浮點數類型包括 float32 和 float64 兩種類型

package main

import "fmt"

func main(){
	
	// 1. float32 位 精度爲 6位
	var f1 float32 = 0.12
	// 浮點數在聲明的時候可以省略整數或者小數部分
	// 但是 建議不要這麼寫, 看着彆扭
	var f2 float32 = .12
	var f3 float32 = 1.

	fmt.Println(f1 ," | ", f2 , " | " , f3)

	//2. float64 位 精度位 15位
	var d1 float64 = 12.2

	fmt.Println(d1)

	var f float32 = 16777216 // 1 << 24
	fmt.Println(f == f+1)    // "true"!

	///3. 可以使用科學計數法聲明浮點數
	var d2 float64 = 3.1415926e13
	// 4. 可以像 C 語言那樣指定 打印多少位 
	fmt.Printf("%.2f" , d2)
	

}

這些浮點數類型的取值範圍可以從很微小到很巨大。浮點數取值範圍的極限值可以在 math 包中找到:

  • 常量 math.MaxFloat32 表示 float32 能取到的最大數值,大約是 3.4e38;
  • 常量 math.MaxFloat64 表示 float64 能取到的最大數值,大約是 1.8e308;
  • float32 和 float64 能表示的最小值分別爲 1.4e-45 和 4.9e-324。

一個 float32 類型的浮點數可以提供大約 6 個十進制數的精度,而 float64 則可以提供約 15 個十進制數的精度,通常應該優先使用 float64 類型,因爲 float32 類型的累計計算誤差很容易擴散,並且 float32 能精確表示的正整數並不是很大。

var f float32 = 16777216 // 1 << 24
fmt.Println(f == f+1)    // "true"!


ads

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章