import "workname/packetfolder"
創(chuàng)新互聯(lián)是專業(yè)的網(wǎng)站建設(shè)公司,提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計(jì)等網(wǎng)站開發(fā)一體化解決方案;包括html5,微信平臺(tái)小程序開發(fā),網(wǎng)站定制,企業(yè)網(wǎng)站建設(shè),商城網(wǎng)站制作,響應(yīng)式網(wǎng)站,建網(wǎng)站,PHP網(wǎng)站建設(shè),軟件開發(fā),軟文營(yíng)銷,網(wǎng)站營(yíng)銷。歡迎做網(wǎng)站的企業(yè)前來(lái)合作洽談,創(chuàng)新互聯(lián)將竭誠(chéng)為您服務(wù)!
導(dǎo)入多個(gè)包
方法調(diào)用 包名.函數(shù)//不是函數(shù)或結(jié)構(gòu)體所處文件或文件夾名
packagename.Func()
前面加個(gè)點(diǎn)表示省略調(diào)用,那么調(diào)用該模塊里面的函數(shù),可以不用寫模塊名稱了:
當(dāng)導(dǎo)入一個(gè)包時(shí),該包下的文件里所有init()函數(shù)都會(huì)被執(zhí)行,然而,有些時(shí)候我們并不需要把整個(gè)包都導(dǎo)入進(jìn)來(lái),僅僅是是希望它執(zhí)行init()函數(shù)而已。下劃線的作用僅僅是為了調(diào)用init()函數(shù),所以無(wú)法通過(guò)包名來(lái)調(diào)用包中的其他函數(shù)
import _ package
變量聲明必須要使用否則會(huì)報(bào)錯(cuò)。
全局變量運(yùn)行聲明但不使用。
func 函數(shù)名 (參數(shù)1,參數(shù)2,...) (返回值a 類型a, 返回值b 類型b,...)
func 函數(shù)名 (參數(shù)1,參數(shù)2,...) (返回值類型1, 返回值類型2,...)
func (this *結(jié)構(gòu)體名) 函數(shù)名(參數(shù) string) (返回值類型1, 返回值類型2){}
使用大小來(lái)區(qū)分函數(shù)可見(jiàn)性
大寫是public類型
小寫是private類型
func prifunc int{}
func pubfunc int{}
聲明靜態(tài)變量
const value int
定義變量
var value int
聲明一般類型、接口和結(jié)構(gòu)體
聲明函數(shù)
func function () int{}
go里面所有的空值對(duì)應(yīng)如下
通道類型
內(nèi)建函數(shù) new 用來(lái)分配內(nèi)存,它的第一個(gè)參數(shù)是一個(gè)類型,不是一個(gè)值,它的返回值是一個(gè)指向新分配類型零值的指針
func new(Type) *Type
[這位博主有非常詳細(xì)的分析]
Go 語(yǔ)言支持并發(fā),我們只需要通過(guò) go 關(guān)鍵字來(lái)開啟 goroutine 即可。
goroutine 是輕量級(jí)線程,goroutine 的調(diào)度是由 Golang 運(yùn)行時(shí)進(jìn)行管理的。
同一個(gè)程序中的所有 goroutine 共享同一個(gè)地址空間。
語(yǔ)法格式如下:
通道(channel)是用來(lái)傳遞數(shù)據(jù)的一個(gè)數(shù)據(jù)結(jié)構(gòu)。
通道的聲明
通道可用于兩個(gè) goroutine 之間通過(guò)傳遞一個(gè)指定類型的值來(lái)同步運(yùn)行和通訊。操作符 - 用于指定通道的方向,發(fā)送或接收。如果未指定方向,則為雙向通道。
[這里有比較詳細(xì)的用例]
go里面的空接口可以指代任何類型(無(wú)論是變量還是函數(shù))
聲明空接口
go里面的的強(qiáng)制類型轉(zhuǎn)換語(yǔ)法為:
int(data)
如果是接口類型的強(qiáng)制轉(zhuǎn)成其他類型的語(yǔ)法為:
go里面的強(qiáng)制轉(zhuǎn)換是將值復(fù)制過(guò)去,所以在數(shù)據(jù)量的時(shí)候有比較高的運(yùn)行代價(jià)
無(wú)緩沖的通道(unbuffered channel)是指在接收前沒(méi)有能力保存任何值的通道。
這種類型的通道要求發(fā)送goroutine和接收goroutine同時(shí)準(zhǔn)備好,才能完成發(fā)送和接收操作。否則,通道會(huì)導(dǎo)致先執(zhí)行發(fā)送或接收操作的 goroutine 阻塞等待。
這種對(duì)通道進(jìn)行發(fā)送和接收的交互行為本身就是同步的。其中任意一個(gè)操作都無(wú)法離開另一個(gè)操作單獨(dú)存在。
阻塞:由于某種原因數(shù)據(jù)沒(méi)有到達(dá),當(dāng)前協(xié)程(線程)持續(xù)處于等待狀態(tài),直到條件滿足,才接觸阻塞。
同步:在兩個(gè)或多個(gè)協(xié)程(線程)間,保持?jǐn)?shù)據(jù)內(nèi)容一致性的機(jī)制。
下圖展示兩個(gè) goroutine 如何利用無(wú)緩沖的通道來(lái)共享一個(gè)值:
在第 1 步,兩個(gè) goroutine 都到達(dá)通道,但哪個(gè)都沒(méi)有開始執(zhí)行發(fā)送或者接收。
在第 2 步,左側(cè)的 goroutine 將它的手伸進(jìn)了通道,這模擬了向通道發(fā)送數(shù)據(jù)的行為。這時(shí),這個(gè) goroutine 會(huì)在通道中被鎖住,直到交換完成。
在第 3 步,右側(cè)的 goroutine 將它的手放入通道,這模擬了從通道里接收數(shù)據(jù)。這個(gè) goroutine 一樣也會(huì)在通道中被鎖住,直到交換完成。
在第 4 步和第 5 步,進(jìn)行交換,并最終,在第 6 步,兩個(gè) goroutine 都將它們的手從通道里拿出來(lái),這模擬了被鎖住的 goroutine 得到釋放。兩個(gè) goroutine 現(xiàn)在都可以去做別的事情了。
如果沒(méi)有指定緩沖區(qū)容量,那么該通道就是同步的,因此會(huì)阻塞到發(fā)送者準(zhǔn)備好發(fā)送和接收者準(zhǔn)備好接收。
無(wú)緩沖channel: —— 同步通信
使用簡(jiǎn)單的 make 調(diào)用創(chuàng)建的通道叫做無(wú)緩沖通道,但 make 還可以接受第二個(gè)可選參數(shù),一個(gè)表示通道容量的整數(shù)。如果容量是 0,make 創(chuàng)建一個(gè)無(wú)緩沖通道。
無(wú)緩沖通道上的發(fā)送操作將被阻塞,直到另一個(gè) goroutine 在對(duì)應(yīng)的通道上執(zhí)行接受操作,這時(shí)值傳送完成,兩個(gè) goroutine 都可以繼續(xù)執(zhí)行。相反,如果接受操作先執(zhí)行,接收方 goroutine 將阻塞,直到另一個(gè) goroutine 在同一個(gè)通道上發(fā)送一個(gè)值。使用無(wú)緩沖通道進(jìn)行的通信導(dǎo)致發(fā)送和接受操作 goroutine 同步化。因此,無(wú)緩沖通道也稱為同步通道。當(dāng)一個(gè)值在無(wú)緩沖通道上傳遞時(shí),接受值后發(fā)送方 goroutine 才能被喚醒。
緩沖通道上的發(fā)送操作在隊(duì)列的尾部插入一個(gè)元素,接收操作從隊(duì)列的頭部移除一個(gè)元素。如果通道滿了,發(fā)送操作會(huì)阻塞所在的 goroutine 直到另一個(gè) goroutine 對(duì)它進(jìn)行接收操作來(lái)留出可用的空間。反過(guò)來(lái),如果通道是空的,執(zhí)行接收操作的 goroutine 阻塞,直到另一個(gè) goroutine 在通道上發(fā)送數(shù)據(jù)。
如果給一個(gè) nil 的 channel 發(fā)送數(shù)據(jù),會(huì)造成永遠(yuǎn)阻塞。
如果從一個(gè) nil 的 channel 中接收數(shù)據(jù),也會(huì)造成永久阻塞。 給一個(gè)已經(jīng)關(guān)閉的 channel 發(fā)送數(shù)據(jù), 會(huì)引起 panic。
從一個(gè)已經(jīng)關(guān)閉的 channel 接收數(shù)據(jù), 如果緩沖區(qū)中為空,則返回一個(gè) 零 值。