一、字符
1、概述
- 字符型存放單個字母或單個文字
- GO語言不支持字符型別,在GO語言中所有字符值都轉換為對應的編碼表中int32值
- GO語言默認使用UTF8編碼
2、編碼發展歷史
- 最開始使用8個可開合晶體管表示世間萬物,這就是位元組的由來,后來生產出可以控制位元組的機器,出現了計算機
- 把位元組中32以下情況稱為控制碼,后再控制碼基礎上添加空格、標點符號、數字、大小寫字母等直到127,最終形成了ASNI的ASCII碼,這是已經較好的支持英文了
- 隨著計算機在全球的應用,在原ASCII基礎上添加了新的字母、符號、橫線豎線等直到255號,從128到255被稱為擴展字符集,但是此時計算機還是在支持英文
- 等中國開始使用計算機,為了支持中文,保留了前127號,這些稱為半角,把后面的內容以兩個位元組拼接形成中文漢字和表單符號,這后半部分就是全角,其中漢字6763個滿足中文大部分情況的要求稱為GB2312
- 隨著計算機在中國的普及,使用GB2312時有的漢字無法打出,又在GB2312基礎上添加了近20000個漢字(包含繁體和符號等)形成GBK,后來為支持少數民族又在GBK基礎上退出了GB18080
- 全球中每個國家都有自己的一套編碼,ISO國際為了統一標準,重新定義了一套編碼,希望包含全球所有的文字和符號,俗稱Unicode
- 隨著互聯網的快速發展,為緩解Unicode網路傳輸中流量浪費問題,出現了UTF編碼,有UTF-8(8位傳輸)和UTF-16(16位傳輸)兩種,其中UTF-8使用最多,為變長編碼方式,中文占3個位元組
二、轉義字符
1、轉義字符介紹
-
在GO語言中可以使用%+特定字母形成轉義字符,這個表示特定含義的組合成為轉義字符
-
在GO語言中又稱為verb
-
轉義字符在GO語言中以下兩種情況使用頻率較高
fmt.Print("verb",內容)//輸出
fmt.Scanf("verb",接受變數)//輸入
2、進制描述
- 進制數在編程中經常遇見,進制數分為二進制、八進制、十進制、十六進制,其中十進制就是平常我們接觸最多的
- X進制都滿足:
- 滿X進一位
- 每位最大為X-1
- 第N位代表X的(n-1)次方
- 其中十六進制中a=10,b=11,c=12,d=13,e=14,f=15
3、常用轉義字符匯總
| Verb | 含義 |
|---|---|
| %d | 十進制整數 |
| %x、%X | 大小寫方式顯示十六進制整數 |
| %o | 八進制整數 |
| %b | 二進制整數 |
| %f、%g、%e | 浮點數 |
| %t | 布林值 |
| %c | 字符 |
| %s | 字串 |
| %q | 帶雙引號字串 |
| %v | 內置格式內容 |
| %T | 型別 |
| %p | 記憶體地址 |
| %% | 字符% |
| \n | 換行 |
| \t | 縮進 |
三、用戶輸入
1、簡介
- 用戶輸入在平時練習中使用頻率較高
- 程式運行時,運行到接受用戶輸入陳述句會阻塞,等待用戶輸入,用戶輸入后,把內容賦值給對應的變數后,程式繼續運行
- 在GO語言中有多重接受用戶輸入的方式,其中使用fmt包的Scan函式使用最簡單
2、接收用戶輸入的幾種方式
-
使用Scanln(&變數名,&變數名)的方式接收
- 輸入的內容必須都在同一行
- 每個內容之間使用空格分隔
- 回車換行后表示停止輸入
- 如果希望接收3個值,而在控制臺只輸入2個值,回車后也停止接收
- 如果希望接收2個值,而在控制臺輸入3個,回車后只能接收兩個值
package main
import "fmt"
func main() {
var name, age string
fmt.Print("請輸入用戶姓名和年齡:")
fmt.Scanln(&name, &age)
fmt.Println("接收到內容為:", name, age)
}
-
也可以使用fmt.Scanf(verb,&變數)按照特定的格式進行輸入
- 下面例子演示的每次換行輸入一個內容
package main
import "fmt"
func main() {
var a, b string
fmt.Println("請輸入姓名和年齡:")
fmt.Scanf("%s\n%s", &a, &b)
fmt.Printf("%s\n%s", a, b)
}
- 需要注意,如果同行輸入兩個字串,中間使用空格,否則編譯器無法對輸入內容進行拆分
四、輸出
1、列印輸出
- 在程式中輸出使用頻率很高,使用輸出陳述句可以再程式執行程序中把一些結果輸出到控制臺,程式員通過控制臺中輸出結果判斷是否符合預期
- 在GO語言中有多重輸出方式,不同的輸出適用場景不同,歸納起來三類,每類又分為三種(原內容、原內容+ln、原內容+f)
- PrintXX()
- FprintXX()
- SprintXX()
2、FprintXX()
- FprintXX在Go Web中使用比較多,把內容寫到回應中
- 以Fprintln()舉例,原始碼如下:
// Fprintln formats using the default formats for its operands and writes to w.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
p := newPrinter()
p.doPrintln(a)
n, err = w.Write(p.buf)
p.free()
return
}
-
函式引數中第一個引數是輸出流,后面引數是內容,表示把內容寫入到輸出流中
-
第一個回傳值表示輸出內容長度(位元組數),第二個回傳值表示錯誤,如果沒有錯誤取nil
- Fprintln()輸出后會添加換行符,所以長度比內容多1個
- Fprintln()原始碼中p.doPrintln(a)的原始碼
// doPrintln is like doPrint but always adds a space between arguments
// and a newline after the last argument.
func (p *pp) doPrintln(a []interface{}) {
for argNum, arg := range a {
if argNum > 0 {
p.buf.writeByte(' ')
}
p.printArg(arg, 'v')
}
p.buf.writeByte('\n')
}
-
FprintXX()支持下面三種方式
- os.Stdout表示控制臺輸出流
func main() {
fmt.Fprint(os.Stdout, "內容1")//向流中寫入內容
fmt.Fprintln(os.Stdout, "內容2")//向流中寫入內容后額外寫入換行符
fmt.Fprintf(os.Stdout, "%s", "內容3")//根據verb格式向流中寫入內容
}
3、PrintXX
- PrintXX支持以下三種方式
func main(){
fmt.Println("內容1")//輸出內容后換行
fmt.Print("內容2")//輸出內容后不換行
fmt.Printf("verb","內容")//根據verb輸出指定格式內容
}
- 以Println()舉例,原始碼如下
// Println formats using the default formats for its operands and writes to standard output.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Println(a ...interface{}) (n int, err error) {
return Fprintln(os.Stdout, a...)
}
- 可以看出Println()底層實際是Fprintln(),回傳值依然是內容長度和錯誤資訊
4、SPrintXX
- 以SPrintln() 為例,和Println()主要的區別是:
- Sprintln()把形式結果以字串回傳,并沒有列印到控制臺
- Println()把結果列印到控制臺,回傳內容長度和錯誤
- 所以嚴格意義角度講SprintXX不是列印輸出,而更像字串轉換
- 原始碼如下
// Sprint formats using the default formats for its operands and returns the resulting string.
// Spaces are added between operands when neither is a string.
func Sprint(a ...interface{}) string {
p := newPrinter()
p.doPrint(a)
s := string(p.buf)
p.free()
return s
}
- 也有三種方式
fmt.Sprint("內容1", "內容2")
fmt.Sprintf()
fmt.Sprintln("1", "2")
五、變數宣告和賦值
1、靜態語言和動態語言
- 靜態型別語言和強型別語言是同一個意思,表示在編譯器就確定了型別,而且型別是不可以改變的
- 動態型別語言和弱型別語言是同一個意思,表示在運行程序中才能確定且內容是什么型別變數型別跟隨變化
2、GO語言變數簡介
- go語言和其他語言一樣都有基本存盤容器,可以存盤一個或多個值在程式中,方便程式中多次使用容器中內容,這個容器稱為變數
- GO語言雖然是靜態型別語言,但是支持動態型別語言語法,因為GO語言希望程式員少宣告變數,增加GC效率
3、變數命名規則
- 以字母或下劃線開頭(GO語言多不以_開頭)
- 后面可以是任意數量的字符、數字和下劃線
- 區分大小寫
- 不能是關鍵字(關鍵字具備特定含義),下面是GO語言的關鍵字
| 關鍵字如下 | ||||
|---|---|---|---|---|
| break | default | func | interface | select |
| case | defer | go | map | struct |
| chan | else | goto | package | switch |
| const | fallthrough | if | range | type |
| continue | for | import | return | var |
- 可以是保留字,但是不建議使用保留字作為變數名,下面是GO語言的保留字
| 保留字如下 | ||||
|---|---|---|---|---|
| true | false | iota | nil | int |
| int8 | int16 | int32 | int64 | unit |
| unit8 | unit16 | unit32 | unitptr | float32 |
| float64 | complex128 | complex64 | bool | byte |
| rune | string | error | make | len |
| cap | new | append | copy | close |
| deletecomplex | real | image | panic | recover |
- 在同一范圍內不允許出現同名變數
- GO語言要求變數宣告后至少使用一次
4、單個變數宣告及賦值
- 先宣告后賦值(宣告后開辟記憶體,不同型別變數都有不同初始值)
//語法
//1.宣告
var 變數名 型別
//2.賦值
變數名=值
- 宣告并賦值(此方式不建議)
//語法
var 變數名 型別 = 值
//實體
var smallming string = "英文名"
- 宣告并賦值(省略型別,變數型別取決于值的型別)
//語法
var 變數名 = 值
- 短變數(只能在函式內使用)
//語法
變數名 := 值
5、宣告多個變數
- 先宣告后賦值
func main(){
var a,b,c int
a,b,c = 1,2,3
fmt.Println(a,b,c)
}
- 宣告時賦值
func main(){
var a,b,c,d = 1,2,3,false
fmt.Println(a,b,c,d)
}
- 宣告并賦值,推薦方式
func main(){
var (
a = 1
b = true
c = "測驗"
)
fmt.Println(a,b,c)
}
- 使用短變數給多個變數賦值時,必須要保證至少有兩個變數沒有宣告的
func main(){
var (
a = 1
b = true
c = "測驗"
)
b,c,d := false, "smallming", 3
fmt.Println(a,b,c,d)
}
六、整型
1、概述
-
在GO語言中可以進行資料運算的型別分為整型和浮點型
-
所有的整數數字存盤到整型中就可以進行數學運算
- 整型和整型運算的結果還是整型(5/2=2)
- 都是整型,但是int8 和int16之間不可以進行運算,必須進行型別轉換
-
整型分為有符合整型和無符號整型
- 有符號整型有正數和負數,其二進制最高位表示符號,0為正數1為負數,int和intx為有符號整型
-
無符號整型只能取大于等于0的整數,其二進制最高位表示真實數字,unit和unitx為無符號整型
-
整型取值范圍和作用
- 有符號整數統一公式為:-2的n-1次冪到2的n-1次冪減1
-
無符號整數統一公式為
| 型別 | 取值范圍 |
|---|---|
| int8 | [-128,127] |
| int16 | [-32768,32767] |
| int32 | [-2147483648,2147483647],GO語言沒有字符型別,所有字符都使用int32 |
| int64 | [-92233722036854775808,9223372036854775807] |
| int | 受限于計算機系統,系統是多少位,int為多少位 |
| unit8 | [0,255] |
| unit16 | [0,65535] |
| unit32 | [0,4294967295] |
| unit64 | [0,18446744073709551615] |
| uint | 受限于計算機系統,系統是多少位,uint為多少位 |
| rune | 與int32類似,常用在獲取值的Unicode碼 |
| byte | 與uint8類似,強調值為原始資料,一個位元組占用8個二進制 |
| uintptr | 大小不確定,類似取決于底層編程 |
2、型別轉換
- GO語言是靜態型別語言,并且不具備低精度向高精度自動轉換功能,所以不同型別變數之間相互賦值需要進行型別轉換
package main
import "fmt"
func main() {
//宣告3個型別變數
var a int = 1
var b int32 = 2
var c int64 = 3
fmt.Println(a, b, c)
//把int32轉換為int64
a = int(b)
fmt.Println(a, b)
a = 1
//把int64轉換為int32
b = int32(c)
fmt.Println(b, c)
b = 2
//把int轉換為int64
c = int64(a)
fmt.Println(a, c)
c = 3
}
3、不同進制整數
- 支持八進制、十進制、十六進制數字創建整型,最后由系統轉換為十進制
- 不支持二進制值
package main
import "fmt"
func main() {
//默認表示十進制
d := 17
//0開頭表示八進制
o := 021
//0x開頭表示十六進制
x := 0x11
//e2表示10的2次方
e := 11e2
//輸出
fmt.Println(d, o, x, e)
//把變數d中內容轉為二進制
b := fmt.Sprintf("%b", d)
fmt.Println(b)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/43069.html
標籤:Go
上一篇:Go檔案:Command go
下一篇:Go語言基礎之單元測驗
