亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語(yǔ)言七篇入門(mén)教程二程序結(jié)構(gòu)與數(shù)據(jù)類型

 更新時(shí)間:2021年11月09日 16:35:48   作者:小生凡一  
這篇文章主要為大家介紹了Go語(yǔ)言的程序結(jié)構(gòu)與數(shù)據(jù)類型,本篇文章是Go語(yǔ)言七篇入門(mén)系列文,有需要的朋友可以借鑒參考下,希望能夠有所幫助

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)型

float64float32 兩種

  • 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ù)

complex64complex128 , 二者分別由float32float64 構(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ǔ)言

第一篇:Go簡(jiǎn)介初識(shí)

第三篇:函數(shù)方法接口的介紹

第四篇:通道與Goroutine的并發(fā)編程

第五篇:文件及包的操作與處理

第六篇:網(wǎng)絡(luò)編程

第七篇:GC垃圾回收三色標(biāo)記

相關(guān)文章

  • golang基于websocket通信tcp keepalive研究記錄

    golang基于websocket通信tcp keepalive研究記錄

    這篇文章主要為大家介紹了golang基于websocket通信tcp keepalive研究記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • golang如何實(shí)現(xiàn)mapreduce單進(jìn)程版本詳解

    golang如何實(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-01
  • Go語(yǔ)言學(xué)習(xí)之反射的用法詳解

    Go語(yǔ)言學(xué)習(xí)之反射的用法詳解

    反射指的是運(yùn)行時(shí)動(dòng)態(tài)的獲取變量的相關(guān)信息。本文將為大家詳細(xì)介紹Go語(yǔ)言中反射的用法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-04-04
  • Golang 刪除文件并遞歸刪除空目錄的操作

    Golang 刪除文件并遞歸刪除空目錄的操作

    這篇文章主要介紹了Golang 刪除文件并遞歸刪除空目錄的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Golang并發(fā)之RWMutex的用法詳解

    Golang并發(fā)之RWMutex的用法詳解

    在?Go?語(yǔ)言中,RWMutex?是一種讀寫(xiě)互斥鎖的實(shí)現(xiàn),它提供了一種簡(jiǎn)單有效的方式來(lái)管理對(duì)共享資源的并發(fā)訪問(wèn)。本文就來(lái)和大家詳細(xì)聊聊RWMutex的用法吧
    2023-04-04
  • Go語(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)方法

    這篇文章主要介紹了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ì)

    這篇文章主要帶大家細(xì)細(xì)探究了Go 泛型generic設(shè)計(jì)及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 下載golang.org/x包的操作方法

    下載golang.org/x包的操作方法

    今天小編就為大家分享一篇下載golang.org/x包的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • go mod 使用私有g(shù)itlab群組的解決方案

    go mod 使用私有g(shù)itlab群組的解決方案

    這篇文章主要介紹了go mod 使用私有g(shù)itlab群組的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • golang服務(wù)報(bào)錯(cuò):?write:?broken?pipe的解決方案

    golang服務(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

最新評(píng)論