Golang 變數#
1. 變數是程式的基本組成單位#
- 不論是使用哪種高級程式語言編寫程式,變數都是其程式的基本組成單位。
sum,sub 都是變數
2. 變數的介紹#
2.1 變數的概念#
變數相當於記憶體中一個資料儲存空間的表示,你可以把變數看做是一個房間的門牌號,通過門牌號我們可以找到房間,同樣的道理,通過變數名可以訪問到變數 (值)。
2.2 變數的使用步驟#
- 聲明變數 (也叫:定義變數)
- 非變數賦值
- 使用變數
2.3 變數快速入門案例#
輸出:
2.4 變數使用注意事項#
- 變數表示記憶體中的一個儲存區域
- 該區域有自己的名稱(變數名)和類型(資料類型)
示意圖:
- Golang 變數使用的三種方式
-
第一種:指定變數類型,聲明後若不賦值,使用預設值
-
第二種:根據值自行判定變數類型 (類型推導)
-
第三種:省略 var, 注意 := 左側的變數不應該是已經聲明過的,否則會導致編譯錯誤
-
多變數聲明
在程式中,有時我們需要一次性聲明多個變數,Golang 也提供這樣的語法舉例說明:
如何一次性聲明多個全域變數【在 go 中函數外部定義變數就是全域變數】:
-
該區域的資料值可以在同一類型範圍內不斷變化 (重點)
-
變數在同一個作用域 (在一個函數或者在程式碼區塊) 內不能重名
-
變數 = 變數名 + 值 + 資料類型,這一點請大家注意,變數的三要素
-
Golang 的變數如果沒有賦初值,編譯器會使用預設值,比如 int 預設值 0 string 預設值為空串,小數默認為 0
2.5 變數的聲明,初始化和賦值#
2.6 程式中 + 號的使用#
- 當左右兩邊都是數值型時,則做加法運算
- 當左右兩邊都是字串,則做字串拼接
2.7 資料類型的基本介紹#
2.8 整數類型#
2.8.1 基本介紹#
簡單的說,就是用於存放整數值的,比如 0, -1, 2345 等等。
2.8.2 整數的各個類型#
int 的無符號的類型:
int 的其它類型的說明:
2.8.4 整型的使用細節#
- Golang 各整數類型分:有符號和無符號,int uint 的大小和系統有關。
- Golang 的整型預設聲明為 int 型
- 如何在程式查看某個變數的位元大小和資料類型 (使用較多)
- Golang 程式中整型變數在使用時,遵守保小不保大的原則,即:在保證程式正確運行下,盡量使用佔用空間小的資料類型。【如:年齡】
- bit: 計算機中的最小儲存單位。byte: 計算機中基本儲存單元。[二進制再詳細說] 1byte = 8 bit
2.9 小數類型 / 浮點型#
2.9.1 基本介紹#
小數類型就是用於存放小數的,比如 1.2 0.23 -1.911
2.9.2 案例演示#
2.9.3 小數類型分類#
對上圖的說明:
-
關於浮點數在機器中存放形式的簡單說明,浮點數 = 符號位 + 指數位 + 尾數位說明:浮點數都是有符號的.
-
尾數部分可能丟失,造成精度損失。 -123.0000901
說明:float64 的精度比 float32 的要準確.
說明:如果我們要保存一個精度高的數,則應該選用 float64 -
浮點型的儲存分為三部分:符號位 + 指數位 + 尾數位 在儲存過程中,精度會有丟失
2.9.4 浮點型使用細節#
- Golang 浮點類型有固定的範圍和欄位長度,不受具體 OS (作業系統) 的影響。
- Golang 的浮點型預設聲明為 float64 類型。
- 浮點型常量有兩種表示形式
十進制數形式:如:5.12 .512 (必須有小數點)
科學計數法形式:如:5.1234e2 = 5.12 * 10 的 2 次方 5.12E-2 = 5.12/10 的 2 次方
- 通常情況下,應該使用 float64 ,因為它比 float32 更精確。[開發中,推薦使用 float64]
2.10 字元類型#
2.10.1 基本介紹#
Golang 中沒有專門的字元類型,如果要儲存單個字元 (字母),一般使用 byte 來保存。
字串就是一串固定長度的字元連接起來的字元序列。Go 的字串是由單個位元組連接起來的。也就是說對於傳統的字串是由字元組成的,而 Go 的字串不同,它是由位元組組成的。
2.10.2 案例演示#
對上面程式碼說明
- 如果我們保存的字元在 ASCII 表的,比如 [0-1, a-z,A-Z..] 直接可以保存到 byte
- 如果我們保存的字元對應碼值大於 255, 這時我們可以考慮使用 int 類型保存
- 如果我們需要按照字元的方式輸出,這時我們需要格式化輸出,即 fmt.Printf (“% c”, c1)..
2.10.3 字元類型使用細節#
- 字元常量是用單引號 ('') 括起來的單個字元。例如:var c1 byte = 'a' var c2 int = ' 中 ' var c3 byte = '9'
- Go 中允許使用轉義字元 '\’來將其後的字元轉變為特殊字元型常量。例如:var c3 char = ‘\n’ // '\n' 表示換行符
- Go 語言的字元使用 UTF-8 編碼 , 如果想查詢字元對應的 utf8 碼值http://www.mytju.com/classcode/tools/encode_utf8.asp
英文字母 - 1 個位元組 漢字 - 3 個位元組 - 在 Go 中,字元的本質是一個整數,直接輸出時,是該字元對應的 UTF-8 編碼的碼值。
- 可以直接給某個變數賦一個數字,然後按格式化輸出時 % c,會輸出該數字對應的 unicode 字元
- 字元類型是可以進行運算的,相當於一個整數,因為它都對應有 Unicode 碼
2.10.4 字元類型本質探討#
- 字元型 儲存到 計算機中,需要將字元對應的碼值(整數)找出來
儲存:字元 ---> 對應碼值 ----> 二進制 --> 儲存
讀取:二進制 ----> 碼值 ----> 字元 --> 讀取 - 字元和碼值的對應關係是通過字元編碼表決定的 (是規定好)
- Go 語言的編碼都統一成了 utf-8。非常的方便,很統一,再也沒有編碼亂碼的困擾了
2.11 布林類型#
2.11.1 基本介紹#
- 布林類型也叫 bool 類型,bool 類型資料只允許取值 true 和 false
- bool 類型佔 1 個位元組。
- bool 類型適於邏輯運算,一般用於程式流程控制 [注:這個後面會詳細介紹]:
- if 條件控制語句;
- for 循環控制語句
2.11.2 案例演示#
2.12string 類型#
2.12.1 基本介紹#
字串就是一串固定長度的字元連接起來的字元序列。Go 的字串是由單個位元組連接起來的。Go 語言的字串的位元組使用 UTF-8 編碼標識 Unicode 文本
2.12.2 案例演示#
2.12.3string 使用注意事項和細節#
- Go 語言的字串的位元組使用 UTF-8 編碼標識 Unicode 文本,這樣 Golang 統一使用 UTF-8 編碼,中文
亂碼問題不會再困擾程式員。 - 字串一旦賦值了,字串就不能修改了:在 Go 中字串是不可變的。
- 字串的兩種表示形式
(1) 雙引號,會識別轉義字元
(2) 反引號,以字串的原生形式輸出,包括換行和特殊字元,可以實現防止攻擊、輸出源碼等效果
【案例演示】
- 字串拼接方式
- 當一行字串太長時,需要使用到多行字串,可以如下處理
2.13 基本資料類型的預設值#
2.13.1 基本介紹#
在 go 中,資料類型都有一個預設值,當程式員沒有賦值時,就會保留預設值,在 go 中,預設值又叫零值。
2.13.2 基本資料類型的預設值如下#
案例:
2.14 基本資料類型的相互轉換#
2.14.1 基本介紹#
Golang 和 java /c 不同,Go 在不同類型的變數之間賦值時需要顯式轉換。也就是說 Golang 中資料類型不能自動轉換。
2.14.2 基本語法#
表達式 T (v) 將值 v 轉換為類型 T
T: 就是資料類型,比如int 32 ,int 64 ,float 32 等等
v:就是需要轉換的變數
2.14.3 案例演示#
3 14 4 基本資料類型相互轉換的注意事項#
1 )Go中,資料類型的轉換可以是從 表示範圍小-->表示範圍大,也可以 范圍大--->範圍小
2 )被轉換的是變數儲存的資料(即值),變數本身的資料類型並沒有變化!
3 )在轉換中,比如將int 64 轉成int 8 【- 128 - -- 127 】,編譯時不會報錯,只是轉換的結果是按溢出處理,和我們希望的結果不一樣。因此在轉換時,需要考慮範圍.
2.15 基本資料類型和 STRING 的轉換#
2.15.1 基本介紹#
在程式開發中,我們經常將基本資料類型轉成 string, 或者將 string 轉成基本資料類型。
2.15.2 基本類型轉 string 類型#
方式 1 :fmt.Sprintf ("% 參數", 表達式) 【個人習慣這個,靈活】
函數的介紹:
參數需要和表達式的資料類型相匹配
fmt.Sprintf()..會返回轉換後的字串
案例演示
方式 2 :使用 strconv 包的函數
案例說明
2.15.3 string 類型轉基本資料類型#
使用時 strconv 包的函數
案例演示
說明一下
2.15.4 string 轉基本資料類型的注意事項#
在將 String 類型轉成 基本資料類型時,要確保 String 類型能夠轉成有效的資料,比如我們可以把 "123", 轉成一個整數,但是不能把 "hello" 轉成一個整數,如果這樣做,Golang 直接將其轉成 0 ,
其它類型也是一樣的道理.float=> 0 bool=>false
案例說明:
2.16 指標#
2.16.1 基本介紹#
1 )基本資料類型,變數存的就是值,也叫值類型
2 )獲取變數的地址,用&,比如:varnumint,獲取num的地址:&num
分析一下基本資料類型在記憶體的佈局.
3 )指標類型,指標變數存的是一個地址,這個地址指向的空間存的才是值
比如:varptr*int=&num
舉例說明:指標在記憶體的佈局.
4 )獲取指標類型所指向的值,使用:*,比如:varptr*int,使用*ptr獲取ptr指向的值
2.16.2 案例演示#
1 )寫一個程式,獲取一個int變數num的地址,並顯示到終端
2 )將num的地址賦給指標 ptr,並通過ptr去修改num的值.
2.16.3 指標的使用細節#
1 ) 值類型,都有對應的指標類型,形式為 資料類型,比如 int 的對應的指標就是int,float 32
對應的指標類型就是 *float 32 , 依次類推。
2 ) 值類型包括:基本資料類型 int 系列,float 系列,bool,string 、陣列和結構體 struct
2.17 值類型和引用類型#
2.17.1 值類型和引用類型的說明#
1 ) 值類型:基本資料類型 int 系列,float 系列,bool,string 、陣列和結構體 struct
2 ) 引用類型:指標、slice 切片、map、管道 chan、interface 等都是引用類型
2.17.2 值類型和引用類型的使用特點#
1 )值類型:變數直接儲存值,記憶體通常在堆疊中分配
示意圖:
2 )引用類型:變數儲存的是一個地址,這個地址對應的空間才真正儲存資料(值),記憶體通常在堆上分配,當沒有任何變數引用這個地址時,該地址對應的資料空間就成為一個垃圾,由GC來回收
示意圖:
3 )記憶體的堆疊區和堆區示意圖
2.18 標識符的命名規範#
2.18.1 標識符概念#
1 )Golang 對各種變數、方法、函數等命名時使用的字元序列稱為標識符
2 )凡是自己可以起名字的地方都叫標識符
2.18.2 標識符的命名規則#
1 )由 26 個英文字母大小寫, 0 - 9 ,_組成
2 )數字不可以開頭。varnumint//ok var 3 numint//error
3 )Golang中嚴格區分大小寫。
var num int
var Num int
說明:在golang中,num 和Num 是兩個不同的變數
4 )標識符不能包含空格。
5 )下劃線"_"本身在Go中是一個特殊的標識符,稱為空標識符。可以代表任何其它的標識符,但是它對應的值會被忽略(比如:忽略某個返回值)。所以僅能被作為佔位符使用,不能作為標識符使用
6 )不能以系統保留關鍵字作為標識符(一共有 25 個),比如 break,if等等...
2.18.3 標識符的案例#
hello //ok
hello 12 //ok
1 hello//error,不能以數字開頭
h-b //error,不能使用 -
xh //error,不能含有空格h_ 4 //ok
_ab //ok
int //ok,我們要求大家不要這樣使用
float 32 //ok,我們要求大家不要這樣使用
_ //error
Abc //ok
2.18.4 標識符命名注意事項#
1 ) 包名:保持 package 的名字和目錄保持一致,儘量採取有意義的包名,簡短,有意義,不要和標準庫不要衝突 fmt
2 )變數名、函數名、常量名:採用駝峰法
舉例:
varstuNamestring=“tom” 形式:xxxYyyyyZzzz...
vargoodPricefloat 32 = 1234. 5
3 ) 如果變數名、函數名、常量名首字母大寫,則可以被其他的包訪問;如果首字母小寫,則只能在本包中使用 (注:可以簡單的理解成,首字母大寫是公開的,首字母小寫是私有的), 在 golang 沒有 public,private 等關鍵字。
案例演示: