Go語(yǔ)言七篇入門(mén)教程二程序結(jié)構(gòu)與數(shù)據(jù)類型
1. 程序結(jié)構(gòu)
1.1 名稱
如果一個(gè)實(shí)體名稱在函數(shù)中聲明,它只在函數(shù)局部有效。如果聲明在函數(shù)外,它將對(duì)包里面的所有源文件可見(jiàn)。
實(shí)體第一個(gè)字母的大小寫(xiě)決定其可見(jiàn)性是否跨包。如果名稱是以大寫(xiě)字母的開(kāi)頭,它是導(dǎo)出的,意味著它對(duì)外包來(lái)說(shuō)是可見(jiàn)的可訪問(wèn)的,可以被自己包外的其他程序所引用。
大寫(xiě)可以!
小寫(xiě)不行!
并且Go語(yǔ)言常常會(huì)使用駝峰式的風(fēng)格命名
func main() { FanOne := "666" //大駝峰 (注意!一般函數(shù)內(nèi)部都是用小駝峰,局部變量,大駝峰一般用于函數(shù)的命名,需要外包的導(dǎo)出) fanOne := "666" //小駝峰 }
當(dāng)然可以使用下劃線比如,不過(guò)我還是比較駝峰式~
1.2 聲明
go語(yǔ)言可通過(guò)var
進(jìn)行變量的聲明
var 變量名 類型
例如:
func main(){ var fanOne string var xiaoSheng int var a,b,c = true , 6.6 , "fanOne" //bool ,float , string }
當(dāng)然也可以使用:=
例如
func main(){ fanOne:="666" //string字符串 xiaoSheng := 666 //int整型 a,b,c := true , 6.6 ,"fanOne" //bool ,float , string }
1.3 注釋
可以用
//單行注釋 /* 多行注釋 */
1.4 單雙引號(hào)
func main(){ var d rune d = '1' a := 'a' b := "a" c := `'a'':"b"` //可以把單引號(hào)和雙引號(hào)整括起來(lái) fmt.Printf("%T\n",d) // int32 fmt.Printf("%T\n",a) // int32 fmt.Printf("%T\n",b) // string fmt.Printf("%T\n",c) // string }
1.5 輸出
//Println 自帶換行 Printf 格式化輸出
2. 數(shù)據(jù)類型
2.1 整型
整型數(shù)據(jù)可以分為兩類,有符號(hào)和無(wú)符號(hào)兩種類型
有符號(hào): int, int8, int16, int32, int64
無(wú)符號(hào): uint, uint8, uint16, uint32, uint64, byte
另外rune
是int32的別名
在保證程序正確運(yùn)行下,盡量使用占用空間小的數(shù)據(jù)類型
- 不同位數(shù)的整型區(qū)別在于能保存整型數(shù)字范圍的大??;
- 有符號(hào)類型可以存儲(chǔ)任何整數(shù),無(wú)符號(hào)類型只能存儲(chǔ)自然數(shù)
- int和uint的大小和系統(tǒng)有關(guān),32位系統(tǒng)表示int32和uint32,如果是64位系統(tǒng)則表示int64和uint64
- byte與uint8類似,一般用來(lái)存儲(chǔ)單個(gè)字符
2.2 浮點(diǎn)型
有 float64
和 float32
兩種
- float64的精度要比f(wàn)loat32的要準(zhǔn)確
- 如果我們要保存一個(gè)精度高的數(shù),則應(yīng)該選擇float64
浮點(diǎn)型的存儲(chǔ)分為三部分:符號(hào)位+指數(shù)位+尾數(shù)位,在存儲(chǔ)過(guò)程中,精度會(huì)有丟失
Go的浮點(diǎn)型默認(rèn)為float64
類型
2.3 復(fù)數(shù)
有complex64
和complex128
, 二者分別由float32
和float64
構(gòu)成,內(nèi)置的complex函數(shù)根據(jù)給定的實(shí)部和虛部創(chuàng)建復(fù)數(shù),而內(nèi)置的real函數(shù)和img函數(shù)則分別提取復(fù)數(shù)的實(shí)部和虛部:
var x complex128 = complex(1,2) //1+2i var y complex128 = complex(3,4) //3+4i fmt.Println(x*y) //-5+10i fmt.Println(real(x*y)) //-5 fmt.Println(imag(x*y)) //10
當(dāng)然我們也可以像這樣
x := 1 + 2i y := 3 + 4i
2.4 布爾型
只有兩種可能true
或者式false
var fanOne true var xiaoSheng false
2.5 字符串
func main(){ s:="FanOne" fmt.Println(len(s)) //6 fmt.Println(s[:3]) //Fan fmt.Println(s[1],s[2]) // 97 110 }
字符串拼接
func main(){ s:="FanOne" b := "666" y := s + b fmt.Println(y) //FanOne666 }
字符串轉(zhuǎn)int
num,err:=strconv.Atoi("666")//num就是整型
int 轉(zhuǎn) 字符串
str := strconv.Itoa(666) //str是字符串
2.6 常量
const a = 666 fmt.Println(a) //666
2.7 數(shù)組
var a [3]int //3個(gè)整數(shù)的數(shù)組 for i , v := range a { fmt.Println(i,v) }
var fan [3]int{1,2,3} var one [3]int{1,3} t := [...]int{1,2,3} //省略號(hào) fmt.Printf("%T",t) //[3]int
go語(yǔ)言的數(shù)組的長(zhǎng)度是固定的,所以在某些場(chǎng)景下數(shù)組存在著它的局限性
而切片的存在就解決了數(shù)組長(zhǎng)度局限的問(wèn)題,切片可以看做一個(gè)可以自動(dòng)擴(kuò)容的數(shù)組,但是它跟數(shù)組還是有著區(qū)別。
2.8 切片
可以通過(guò)make
或切片字面量
來(lái)創(chuàng)建和初始化切片,也可以利用現(xiàn)有數(shù)組或切片直接創(chuàng)建切片(Go語(yǔ)言中的引用類型(slice、map、chan)不能使用new
進(jìn)行初始化)。
使用make時(shí),需要傳入一個(gè)參數(shù)指定切片的長(zhǎng)度,如果只指定長(zhǎng)度,則切片的容量和長(zhǎng)度相等。也可以傳入兩個(gè)參數(shù)分別指定長(zhǎng)度和容量。不允許創(chuàng)建容量小于長(zhǎng)度的切片。
// make只傳入一個(gè)參數(shù)指定長(zhǎng)度,則容量和長(zhǎng)度相等。以下輸出:"len: 10, cap: 10" s := make([]int, 10) fmt.Printf("len: %d, cap: %d\n", len(s), cap(s)) // make 傳入長(zhǎng)度和容量。以下輸出:"len: 10, cap: 15" s := make([]int, 10, 15) fmt.Printf("len: %d, cap: %d\n", len(s), cap(s)) // 不允許創(chuàng)建容量小于長(zhǎng)度的切片。下面語(yǔ)句編譯會(huì)報(bào)錯(cuò):"len larger than cap in make([]int)" s := make([]int, 10, 5)
通過(guò)切片字面量來(lái)聲明切片。
// 通過(guò)字面量聲明切片,其長(zhǎng)度和容量都為5。以下輸出:“l(fā)en: 5, cap: 5” s := []int{1, 2, 3, 4, 5} fmt.Printf("len: %d, cap: %d\n", len(s), cap(s)) // 可以在聲明切片時(shí)利用索引來(lái)給出所需的長(zhǎng)度和容量。 // 通過(guò)指定索引為99的元素,來(lái)創(chuàng)建一個(gè)長(zhǎng)度和容量為100的切片 s := []int{99: 0}
基于現(xiàn)有數(shù)組或切片來(lái)創(chuàng)建切片的方法為:s := baseStr[low:high:max],low指定開(kāi)始元素下標(biāo),high指定結(jié)束元素下標(biāo),max指定切片能增長(zhǎng)到的元素下標(biāo)。這三個(gè)參數(shù)都可以省略,low省略默認(rèn)從下標(biāo)0開(kāi)始,high省略默認(rèn)為最后一個(gè)元素下標(biāo),max省略默認(rèn)是底層數(shù)組或切片的容量(這里也要注意max不能小于high)。這種方式下,切片的長(zhǎng)度和容量的計(jì)算方式為:
len = hith - low cap = max - low s1 := baseStr[1:3:10] fmt.Printf("len: %d, cap: %d\n", len(s1), cap(s1)) // len: 2, cap: 9 s2 := baseStr[1:3] fmt.Printf("len: %d, cap: %d\n", len(s2), cap(s2)) // len: 2, cap: 9 s3 := baseStr[:3] fmt.Printf("len: %d, cap: %d\n", len(s3), cap(s3)) // len: 3, cap: 10 ss1 := s1[2:5] ss2 := s1[3:8] fmt.Printf("len: %d, cap: %d\n", len(ss1), cap(ss1)) // len: 3, cap: 7 fmt.Printf("len: %d, cap: %d\n", len(ss2), cap(ss2)) // len: 5, cap: 6
增加可以用append
// 創(chuàng)建一個(gè)整型切片 // 其長(zhǎng)度和容量都是5個(gè)元素 slice := []int{1, 2, 3, 4, 5} // 創(chuàng)建一個(gè)新切片 // 其長(zhǎng)度為2 個(gè)元素,容量為4個(gè)元素 newSlice := slice[1:3] // 使用原有的容量來(lái)分配一個(gè)新元素 // 將新元素賦值為 60 newSlice = append(newSlice, 6) fmt.Printf("slice: %v\n", slice) // slice: [1 2 3 6 5] fmt.Printf("newSlice: %v\n", newSlice) // newSlice: [2 3 6]
2.9 map
Map
是一種無(wú)序的鍵值對(duì)的集合。Map 最重要的一點(diǎn)是通過(guò) key 來(lái)快速檢索數(shù)據(jù),key 類似于索引,指向數(shù)據(jù)的值。
Map 是一種集合,所以我們可以像迭代數(shù)組和切片那樣迭代它。不過(guò),Map 是無(wú)序的,我們無(wú)法決定它的返回順序,這是因?yàn)?Map 是使用 hash 表來(lái)實(shí)現(xiàn)的。
聲明
/* 聲明變量,默認(rèn) map 是 nil */ var map_variable map[key_data_type]value_data_type /* 使用 make 函數(shù) */ map_variable := make(map[key_data_type]value_data_type)
var fan map[string]string //創(chuàng)建集合 fan = make(map[string]string) //map插入key-value對(duì) fan [ "One" ] = "666" fan [ "Four" ] = "999" //使用鍵輸出 for value := range fan { fmt.Println(value, "is", fan [value]) } //查看元素在集合中是否存在 val, ok := fan [ "Two" ] //如果確定是真實(shí)的,則存在,否則不存在 if ok { fmt.Println("fanTwo is", val) } else { fmt.Println("fanTwo not exist") }
delete() 函數(shù)用于刪除集合的元素, 參數(shù)為 map 和其對(duì)應(yīng)的 key。
可以使用delete
方法刪除
delete(fan , "One")
2.10 結(jié)構(gòu)體
結(jié)構(gòu)體定義需要使用 type 和 struct 語(yǔ)句。struct 語(yǔ)句定義一個(gè)新的數(shù)據(jù)類型,結(jié)構(gòu)體中有一個(gè)或多個(gè)成員。type 語(yǔ)句設(shè)定了結(jié)構(gòu)體的名稱。結(jié)構(gòu)體的格式如下:
type Person struct{ name string age int sex string } func main(){ person := Person{ //初始化 name: "fanOne", age: 16, sex: "male", } fmt.Println(person.name) //引用 }
2.11 JSON
type Person struct{ Name string `json:"name"` //序列化成string類型 Age int `json:"age"` Sex string `json:"sex"` } func main(){ person := &Person{} //創(chuàng)建一個(gè)對(duì)象 var data = `{"name":"fanOne","age":"11","sex":"male"}` _ = json.Unmarshal([]byte(data), &person) //將這個(gè)data序列化成person的結(jié)構(gòu)體,并傳入其中 fmt.Println(person.Name) }
3. 流程控制
3.1 條件語(yǔ)句
func main(){ x :=1 if x == 1 { fmt.Println("666") } else { fmt.Println("999") } }
3.2 選擇語(yǔ)句
switch i { case 0: fmt.Printf("0") case 1: fmt.Printf("1") case 2: fmt.Printf("2") case 3: fmt.Printf("3") case 4, 5, 6: fmt.Printf("4, 5, 6") default: fmt.Printf("Default") }
3.3 循環(huán)語(yǔ)句
sum := 0 for i := 0; i < 10; i++ { sum += i }
s := [3]int{1,2,3} for _,item := range s{ fmt.Println(item) }
以上就是Go語(yǔ)言七篇入門(mén)程序結(jié)構(gòu)與數(shù)據(jù)類型的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言程序結(jié)構(gòu)與數(shù)據(jù)類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
如何學(xué)習(xí)Go
如果你是小白,你可以這樣學(xué)習(xí)Go語(yǔ)言~
七篇入門(mén)Go語(yǔ)言
第三篇:函數(shù)方法接口的介紹
第五篇:文件及包的操作與處理
第六篇:網(wǎng)絡(luò)編程
第七篇:GC垃圾回收三色標(biāo)記
相關(guān)文章
golang基于websocket通信tcp keepalive研究記錄
這篇文章主要為大家介紹了golang基于websocket通信tcp keepalive研究記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06golang如何實(shí)現(xiàn)mapreduce單進(jìn)程版本詳解
這篇文章主要給大家介紹了關(guān)于golang如何實(shí)現(xiàn)mapreduce單進(jìn)程版本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01Go語(yǔ)言服務(wù)器開(kāi)發(fā)之簡(jiǎn)易TCP客戶端與服務(wù)端實(shí)現(xiàn)方法
這篇文章主要介紹了Go語(yǔ)言服務(wù)器開(kāi)發(fā)之簡(jiǎn)易TCP客戶端與服務(wù)端實(shí)現(xiàn)方法,實(shí)例分析了基于Go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)易服務(wù)器的TCP客戶端與服務(wù)器端實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-02-02細(xì)細(xì)探究Go 泛型generic設(shè)計(jì)
這篇文章主要帶大家細(xì)細(xì)探究了Go 泛型generic設(shè)計(jì)及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04golang服務(wù)報(bào)錯(cuò):?write:?broken?pipe的解決方案
在開(kāi)發(fā)在線客服系統(tǒng)的時(shí)候,看到日志里有一些錯(cuò)誤信息,下面這篇文章主要給大家介紹了關(guān)于golang服務(wù)報(bào)錯(cuò):?write:?broken?pipe的解決方案,需要的朋友可以參考下2022-09-09