一、介紹go標(biāo)準(zhǔn)庫(kù)中的bufio
創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比迎澤網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式迎澤網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋迎澤地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴(lài)。
最近用golang寫(xiě)了一個(gè)處理文件的腳本,由于其中涉及到了文件讀寫(xiě),開(kāi)始使用golang中的 io 包,后來(lái)發(fā)現(xiàn)golang 中提供了一個(gè)bufio的包,使用這個(gè)包可以大幅提高文件讀寫(xiě)的效率,于是在網(wǎng)上搜索同樣的文件讀寫(xiě)為什么bufio 要比io 的讀寫(xiě)更快速呢?根據(jù)網(wǎng)上的資料和閱讀源碼,以下來(lái)詳細(xì)解釋下bufio的高效如何實(shí)現(xiàn)的。
bufio 包介紹
bufio包實(shí)現(xiàn)了有緩沖的I/O。它包裝一個(gè)io.Reader或io.Writer接口對(duì)象,創(chuàng)建另一個(gè)也實(shí)現(xiàn)了該接口,且同時(shí)還提供了緩沖和一些文本I/O的幫助函數(shù)的對(duì)象。
以上為官方包的介紹,在其中我們能了解到的信息如下:
bufio 是通過(guò)緩沖來(lái)提高效率
簡(jiǎn)單的說(shuō)就是,把文件讀取進(jìn)緩沖(內(nèi)存)之后再讀取的時(shí)候就可以避免文件系統(tǒng)的io 從而提高速度。同理,在進(jìn)行寫(xiě)操作時(shí),先把文件寫(xiě)入緩沖(內(nèi)存),然后由緩沖寫(xiě)入文件系統(tǒng)??赐暌陨辖忉層腥丝赡軙?huì)表示困惑了,直接把 內(nèi)容-文件 和 內(nèi)容-緩沖-文件相比, 緩沖區(qū)好像沒(méi)有起到作用嘛。其實(shí)緩沖區(qū)的設(shè)計(jì)是為了存儲(chǔ)多次的寫(xiě)入,最后一口氣把緩沖區(qū)內(nèi)容寫(xiě)入文件。下面會(huì)詳細(xì)解釋
bufio 封裝了io.Reader或io.Writer接口對(duì)象,并創(chuàng)建另一個(gè)也實(shí)現(xiàn)了該接口的對(duì)象
io.Reader或io.Writer 接口實(shí)現(xiàn)read() 和 write() 方法,對(duì)于實(shí)現(xiàn)這個(gè)接口的對(duì)象都是可以使用這兩個(gè)方法的
注明:介紹內(nèi)容來(lái)自博主 LiangWenT
,原文鏈接: ,在查找資料時(shí),發(fā)現(xiàn)這篇博客的內(nèi)容很好理解
bufio包實(shí)現(xiàn)了緩存IO。它包裝了io.Reader和io.Write對(duì)象,創(chuàng)建了另外的Reader和Writer對(duì)象,它們也實(shí)現(xiàn)了io.Reader和io.Write接口,具有緩存。注意:緩存是放在主存中,既然是保存在主存里,斷電會(huì)丟失數(shù)據(jù),那么要及時(shí)保存數(shù)據(jù)。
二、常用內(nèi)容
1、Reader類(lèi)型
NewReaderSize
作用:NewReaderSize將rd封裝成一個(gè)帶緩存的bufio.Reader對(duì)象。緩存大小由size指定(如果小于16則會(huì)被設(shè)為16)。如果rd的基類(lèi)型就是有足夠緩存的bufio.Reader類(lèi)型,則直接將rd轉(zhuǎn)換為基類(lèi)型返回。
NewReader
funcReader相當(dāng)于NewReaderSize(rd, 4096)
Peek
Peek返回緩存的一個(gè)切片,該切片引用緩存中前n個(gè)字節(jié)的數(shù)據(jù),該操作不會(huì)將數(shù)據(jù)讀出,只是引用,引用的數(shù)據(jù)在下一次讀取操作之前有效的。如果切片長(zhǎng)度小于n,則返回一個(gè)錯(cuò)誤信息說(shuō)明原因。如果n大于緩存的總大小,則返回ErrBufferFull。
Read
Read從b中數(shù)據(jù)到p中,返回讀出的字節(jié)數(shù)和遇到的錯(cuò)誤。如果緩存不為空,則只能讀出緩沖中的數(shù)據(jù),不會(huì)從底層io.Reader中提取數(shù)據(jù),如果緩存為空,則:
1、len(p) = 緩存大小,則跳過(guò)緩存,直接從底層io.Reader中讀出到p中
2、len(p) 緩存大小,則先將數(shù)據(jù)從底層io.Reader中讀取到緩存中,再?gòu)木彺孀x取到p中。
Buffered
Buffered返回緩存中未讀取的數(shù)據(jù)的長(zhǎng)度。
Discard
Discard跳過(guò)后續(xù)的n個(gè)字節(jié)的數(shù)據(jù),返回跳過(guò)的字節(jié)數(shù)。
Writer類(lèi)型和方法
write結(jié)構(gòu)
NewWriteSize
NewWriterSize將wr封裝成一個(gè)帶緩存的bufio.Writer對(duì)象,緩存大小由size指定(如果小于4096則會(huì)被設(shè)置未4096)。
NewWrite
NewWriter相等于NewWriterSize(wr, 4096)
WriteString
WriteString功能同Write,只不過(guò)寫(xiě)入的是字符串
WriteRune
WriteRune向b寫(xiě)入r的UTF-8編碼,返回r的編碼長(zhǎng)度。
Flush
Available
Available 返回緩存中未使用的空間的長(zhǎng)度
Buffered
Buffered返回緩存中未提交的數(shù)據(jù)長(zhǎng)度
Reset
Reset將b的底層Write重新指定為w,同時(shí)丟棄緩存中的所有數(shù)據(jù),復(fù)位所有標(biāo)記和錯(cuò)誤信息。相當(dāng)于創(chuàng)建了一個(gè)新的bufio.Writer。
GO中還提供了Scanner類(lèi)型,處理一些比較簡(jiǎn)單的場(chǎng)景。如處理按行讀取輸入序列或空格分隔的詞等。
內(nèi)容來(lái)自:
參考鏈接:
1)
2)
1、反射可以在運(yùn)行時(shí) 動(dòng)態(tài)獲取變量的各種信息 ,比如變量的類(lèi)型、類(lèi)別;
2、如果是結(jié)構(gòu)體變量,還可以獲取到結(jié)構(gòu)體本身的信息(包括結(jié)構(gòu)體的字段、方法);
3、通過(guò)反射,可以修改 變量的值 ,可以調(diào)用關(guān)聯(lián)的方法;
4、使用反射,需要import " reflect ".
5、示意圖:
1、不知道接口調(diào)用哪個(gè)函數(shù),根據(jù)傳入?yún)?shù)在運(yùn)行時(shí)確定調(diào)用的具體接口,這種需要對(duì)函數(shù)或方法反射。
例如以下這種橋接模式:
示例第一個(gè)參數(shù)funcPtr以接口的形式傳入函數(shù)指針,函數(shù)參數(shù)args以可變參數(shù)的形式傳入,bridge函數(shù)中可以用反射來(lái)動(dòng)態(tài)執(zhí)行funcPtr函數(shù)。
1、reflect.TypeOf(變量名),獲取變量的類(lèi)型,返回reflect.Type類(lèi)型。
2、reflect.ValueOf(變量名),獲取變量的值,返回reflect.Value類(lèi)型reflect.Value是一個(gè)結(jié)構(gòu)體類(lèi)型。
3、變量、interface{}和reflect.Value是可以互相轉(zhuǎn)換的,這點(diǎn)在實(shí)際開(kāi)發(fā)中,會(huì)經(jīng)常使用到。
1、reflect.Value.Kind,獲取變量的 類(lèi)別(Kind) ,返回的是一個(gè) 常量 。在go語(yǔ)言文檔中:
示例如下所示:
輸出如下:
Kind的范疇要比Type大。比如有Student和Consumer兩個(gè)結(jié)構(gòu)體,他們的 Type 分別是 Student 和 Consumer ,但是它們的 Kind 都是 struct 。
2、Type是類(lèi)型,Kind是類(lèi)別,Type和Kind可能是相同的,也可能是不同的。
3、通過(guò)反射可以在讓 變量 在 interface{} 和 Reflect.Value 之間相互轉(zhuǎn)換,這點(diǎn)在前面畫(huà)過(guò)示意圖。
4、使用反射的方式來(lái)獲取變量的值(并返回對(duì)應(yīng)的類(lèi)型),要求數(shù)據(jù)類(lèi)型匹配,比如x是int,那么久應(yīng)該使用reflect.Value(x).Int(),而不能使用其它的,否則報(bào)panic。
如果是x是float類(lèi)型的話(huà),也是要用reflect.Value(x).Float()。但是如果是struct類(lèi)型的話(huà),由于type并不確定,所以沒(méi)有相應(yīng)的方法,只能 斷言。
5、通過(guò)反射的來(lái)修改變量,注意當(dāng)使用SetXxx方法來(lái)設(shè)置需要通過(guò)對(duì)應(yīng)的指針類(lèi)型來(lái)完成,這樣才能改變傳入的變量的值,同時(shí)需要使用到reflect.Value.Elem()方法。
輸出num=20,即成功使用反射來(lái)修改傳進(jìn)來(lái)變量的值。
6、reflect.Value.Elem()應(yīng)該如何理解?
原文:【 】
如果有解答的不對(duì)的,麻煩各位在評(píng)論寫(xiě)出來(lái)~
go的調(diào)度原理是基于GMP模型,G代表一個(gè)goroutine,不限制數(shù)量;M=machine,代表一個(gè)線程,最大1萬(wàn),所有G任務(wù)還是在M上執(zhí)行;P=processor代表一個(gè)處理器,每一個(gè)允許的M都會(huì)綁定一個(gè)G,默認(rèn)與邏輯CPU數(shù)量相等(通過(guò)runtime.GOMAXPROCS(runtime.NumCPU())設(shè)置)。
go調(diào)用過(guò)程:
可以能,也可以不能。
因?yàn)間o存在不能使用==判斷類(lèi)型:map、slice,如果struct包含這些類(lèi)型的字段,則不能比較。
這兩種類(lèi)型也不能作為map的key。
類(lèi)似棧操作,后進(jìn)先出。
因?yàn)間o的return是一個(gè)非原子性操作,比如語(yǔ)句 return i ,實(shí)際上分兩步進(jìn)行,即將i值存入棧中作為返回值,然后執(zhí)行跳轉(zhuǎn),而defer的執(zhí)行時(shí)機(jī)正是跳轉(zhuǎn)前,所以說(shuō)defer執(zhí)行時(shí)還是有機(jī)會(huì)操作返回值的。
select的case的表達(dá)式必須是一個(gè)channel類(lèi)型,所有case都會(huì)被求值,求值順序自上而下,從左至右。如果多個(gè)case可以完成,則會(huì)隨機(jī)執(zhí)行一個(gè)case,如果有default分支,則執(zhí)行default分支語(yǔ)句。如果連default都沒(méi)有,則select語(yǔ)句會(huì)一直阻塞,直到至少有一個(gè)IO操作可以進(jìn)行。
break關(guān)鍵字可跳出select的執(zhí)行。
goroutine管理、信息傳遞。context的意思是上下文,在線程、協(xié)程中都有這個(gè)概念,它指的是程序單元的一個(gè)運(yùn)行狀態(tài)、現(xiàn)場(chǎng)、快照,包含。context在多個(gè)goroutine中是并發(fā)安全的。
應(yīng)用場(chǎng)景:
例子參考:
waitgroup
channel
len:切片的長(zhǎng)度,訪問(wèn)時(shí)間復(fù)雜度為O(1),go的slice底層是對(duì)數(shù)組的引用。
cap:切片的容量,擴(kuò)容是以這個(gè)值為標(biāo)準(zhǔn)。默認(rèn)擴(kuò)容是2倍,當(dāng)達(dá)到1024的長(zhǎng)度后,按1.25倍。
擴(kuò)容:每次擴(kuò)容slice底層都將先分配新的容量的內(nèi)存空間,再將老的數(shù)組拷貝到新的內(nèi)存空間,因?yàn)檫@個(gè)操作不是并發(fā)安全的。所以并發(fā)進(jìn)行append操作,讀到內(nèi)存中的老數(shù)組可能為同一個(gè),最終導(dǎo)致append的數(shù)據(jù)丟失。
共享:slice的底層是對(duì)數(shù)組的引用,因此如果兩個(gè)切片引用了同一個(gè)數(shù)組片段,就會(huì)形成共享底層數(shù)組。當(dāng)sliec發(fā)生內(nèi)存的重新分配(如擴(kuò)容)時(shí),會(huì)對(duì)共享進(jìn)行隔斷。詳細(xì)見(jiàn)下面例子:
make([]Type,len,cap)
map的底層是hash table(hmap類(lèi)型),對(duì)key值進(jìn)行了hash,并將結(jié)果的低八位用于確定key/value存在于哪個(gè)bucket(bmap類(lèi)型)。再將高八位與bucket的tophash進(jìn)行依次比較,確定是否存在。出現(xiàn)hash沖撞時(shí),會(huì)通過(guò)bucket的overflow指向另一個(gè)bucket,形成一個(gè)單向鏈表。每個(gè)bucket存儲(chǔ)8個(gè)鍵值對(duì)。
如果要實(shí)現(xiàn)map的順序讀取,需要使用一個(gè)slice來(lái)存儲(chǔ)map的key并按照順序進(jìn)行排序。
利用map,如果要求并發(fā)安全,就用sync.map
要注意下set中的delete函數(shù)需要使用 delete(map) 來(lái)實(shí)現(xiàn),但是這個(gè)并不會(huì)釋放內(nèi)存,除非value也是一個(gè)子map。當(dāng)進(jìn)行多次delete后,可以使用make來(lái)重建map。
使用sync.Map來(lái)管理topic,用channel來(lái)做隊(duì)列。
參考:
多路歸并法:
pre class="vditor-reset" placeholder="" contenteditable="true" spellcheck="false"p data-block="0"(1)假設(shè)有K路a href=""數(shù)據(jù)流/a,流內(nèi)部是有序的,且流間同為升序或降序;
/pp data-block="0"(2)首先讀取每個(gè)流的第一個(gè)數(shù),如果已經(jīng)EOF,pass;
/pp data-block="0"(3)將有效的k(k可能小于K)個(gè)數(shù)比較,選出最小的那路mink,輸出,讀取mink的下一個(gè);
/pp data-block="0"(4)直到所有K路都EOF。
/p/pre
假設(shè)文件又1個(gè)G,內(nèi)存只有256M,無(wú)法將1個(gè)G的文件全部讀到內(nèi)存進(jìn)行排序。
第一步:
可以分為10段讀取,每段讀取100M的數(shù)據(jù)并排序好寫(xiě)入硬盤(pán)。
假設(shè)寫(xiě)入后的文件為A,B,C...10
第二步:
將A,B,C...10的第一個(gè)字符拿出來(lái),對(duì)這10個(gè)字符進(jìn)行排序,并將結(jié)果寫(xiě)入硬盤(pán),同時(shí)記錄被寫(xiě)入的字符的文件指針P。
第三步:
將剛剛排序好的9個(gè)字符再加上從指針P讀取到的P+1位數(shù)據(jù)進(jìn)行排序,并寫(xiě)入硬盤(pán)。
重復(fù)二、三步驟。
go文件讀寫(xiě)參考:
保證排序前兩個(gè)相等的數(shù)其在序列的前后位置順序和排序后它們兩個(gè)的前后位置順序相同的排序叫穩(wěn)定排序。
快速排序、希爾排序、堆排序、直接選擇排序不是穩(wěn)定的排序算法。
基數(shù)排序、冒泡排序、直接插入排序、折半插入排序、歸并排序是穩(wěn)定的排序算法。
參考:
head只請(qǐng)求頁(yè)面的首部。多用來(lái)判斷網(wǎng)頁(yè)是否被修改和超鏈接的有效性。
get請(qǐng)求頁(yè)面信息,并返回實(shí)例的主體。
參考:
401:未授權(quán)的訪問(wèn)。
403: 拒絕訪問(wèn)。
普通的http連接是客戶(hù)端連接上服務(wù)端,然后結(jié)束請(qǐng)求后,由客戶(hù)端或者服務(wù)端進(jìn)行http連接的關(guān)閉。下次再發(fā)送請(qǐng)求的時(shí)候,客戶(hù)端再發(fā)起一個(gè)連接,傳送數(shù)據(jù),關(guān)閉連接。這么個(gè)流程反復(fù)。但是一旦客戶(hù)端發(fā)送connection:keep-alive頭給服務(wù)端,且服務(wù)端也接受這個(gè)keep-alive的話(huà),兩邊對(duì)上暗號(hào),這個(gè)連接就可以復(fù)用了,一個(gè)http處理完之后,另外一個(gè)http數(shù)據(jù)直接從這個(gè)連接走了。減少新建和斷開(kāi)TCP連接的消耗。這個(gè)可以在Nginx設(shè)置,
這個(gè)keepalive_timout時(shí)間值意味著:一個(gè)http產(chǎn)生的tcp連接在傳送完最后一個(gè)響應(yīng)后,還需要hold住keepalive_timeout秒后,才開(kāi)始關(guān)閉這個(gè)連接。
特別注意TCP層的keep alive和http不是一個(gè)意思。TCP的是指:tcp連接建立后,如果客戶(hù)端很長(zhǎng)一段時(shí)間不發(fā)送消息,當(dāng)連接很久沒(méi)有收到報(bào)文,tcp會(huì)主動(dòng)發(fā)送一個(gè)為空的報(bào)文(偵測(cè)包)給對(duì)方,如果對(duì)方收到了并且回復(fù)了,證明對(duì)方還在。如果對(duì)方?jīng)]有報(bào)文返回,重試多次之后則確認(rèn)連接丟失,斷開(kāi)連接。
tcp的keep alive可通過(guò)
net.ipv4.tcp_keepalive_intvl = 75 // 當(dāng)探測(cè)沒(méi)有確認(rèn)時(shí),重新發(fā)送探測(cè)的頻度。缺省是75秒。
net.ipv4.tcp_keepalive_probes = 9 //在認(rèn)定連接失效之前,發(fā)送多少個(gè)TCP的keepalive探測(cè)包。缺省值是9。這個(gè)值乘以tcp_keepalive_intvl之后決定了,一個(gè)連接發(fā)送了keepalive之后可以有多少時(shí)間沒(méi)有回應(yīng)
net.ipv4.tcp_keepalive_time = 7200 //當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度。缺省是2小時(shí)。一般設(shè)置為30分鐘1800
修改:
可以
tcp是面向連接的,upd是無(wú)連接狀態(tài)的。
udp相比tcp沒(méi)有建立連接的過(guò)程,所以更快,同時(shí)也更安全,不容易被攻擊。upd沒(méi)有阻塞控制,因此出現(xiàn)網(wǎng)絡(luò)阻塞不會(huì)使源主機(jī)的發(fā)送效率降低。upd支持一對(duì)多,多對(duì)多等,tcp是點(diǎn)對(duì)點(diǎn)傳輸。tcp首部開(kāi)銷(xiāo)20字節(jié),udp8字節(jié)。
udp使用場(chǎng)景:視頻通話(huà)、im聊天等。
time-wait表示客戶(hù)端等待服務(wù)端返回關(guān)閉信息的狀態(tài),closed_wait表示服務(wù)端得知客戶(hù)端想要關(guān)閉連接,進(jìn)入半關(guān)閉狀態(tài)并返回一段TCP報(bào)文。
time-wait作用:
解決辦法:
close_wait:
被動(dòng)關(guān)閉,通常是由于客戶(hù)端忘記關(guān)閉tcp連接導(dǎo)致。
根據(jù)業(yè)務(wù)來(lái)啊~
重要指標(biāo)是cardinality(不重復(fù)數(shù)量),這個(gè)數(shù)量/總行數(shù)如果過(guò)?。ㄚ吔?)代表索引基本沒(méi)意義,比如sex性別這種。
另外查詢(xún)不要使用select *,根據(jù)select的條件+where條件做組合索引,盡量實(shí)現(xiàn)覆蓋索引,避免回表。
僵尸進(jìn)程:
即子進(jìn)程先于父進(jìn)程退出后,子進(jìn)程的PCB需要其父進(jìn)程釋放,但是父進(jìn)程并沒(méi)有釋放子進(jìn)程的PCB,這樣的子進(jìn)程就稱(chēng)為僵尸進(jìn)程,僵尸進(jìn)程實(shí)際上是一個(gè)已經(jīng)死掉的進(jìn)程。
孤兒進(jìn)程:
一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作。
子進(jìn)程死亡需要父進(jìn)程來(lái)處理,那么意味著正常的進(jìn)程應(yīng)該是子進(jìn)程先于父進(jìn)程死亡。當(dāng)父進(jìn)程先于子進(jìn)程死亡時(shí),子進(jìn)程死亡時(shí)沒(méi)父進(jìn)程處理,這個(gè)死亡的子進(jìn)程就是孤兒進(jìn)程。
但孤兒進(jìn)程與僵尸進(jìn)程不同的是,由于父進(jìn)程已經(jīng)死亡,系統(tǒng)會(huì)幫助父進(jìn)程回收處理孤兒進(jìn)程。所以孤兒進(jìn)程實(shí)際上是不占用資源的,因?yàn)樗K究是被系統(tǒng)回收了。不會(huì)像僵尸進(jìn)程那樣占用ID,損害運(yùn)行系統(tǒng)。
原文鏈接:
產(chǎn)生死鎖的四個(gè)必要條件:
(1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。
(2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。
(3) 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。
(4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
避免方法:
端口占用:lsof -i:端口號(hào) 或者 nestat
cpu、內(nèi)存占用:top
發(fā)送信號(hào):kill -l 列出所有信號(hào),然后用 kill [信號(hào)變化] [進(jìn)程號(hào)]來(lái)執(zhí)行。如kill -9 453。強(qiáng)制殺死453進(jìn)程
git log:查看提交記錄
git diff :查看變更記錄
git merge:目標(biāo)分支改變,而源分支保持原樣。優(yōu)點(diǎn):保留提交歷史,保留分支結(jié)構(gòu)。但會(huì)有大量的merge記錄
git rebase:將修改拼接到最新,復(fù)雜的記錄變得優(yōu)雅,單個(gè)操作變得(revert)很簡(jiǎn)單;缺點(diǎn):
git revert:反做指定版本,會(huì)新生成一個(gè)版本
git reset:重置到某個(gè)版本,中間版本全部丟失
etcd、Consul
pprof
節(jié)省空間(非葉子節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),相對(duì)b tree的優(yōu)勢(shì)),減少I(mǎi)/O次數(shù)(節(jié)省的空間全部存指針地址,讓樹(shù)變的矮胖),范圍查找方便(相對(duì)hash的優(yōu)勢(shì))。
explain
其他的見(jiàn):
runtime2.go 中關(guān)于 p 的定義: 其中 runnext 指針決定了下一個(gè)要運(yùn)行的 g,根據(jù)英文的注釋大致意思是說(shuō):
所以當(dāng)設(shè)置 runtime.GOMAXPROCS(1) 時(shí),此時(shí)只有一個(gè) P,創(chuàng)建的 g 依次加入 P, 當(dāng)最后一個(gè)即 i==9 時(shí),加入的最后 一個(gè) g 將會(huì)繼承當(dāng)前主 goroutinue 的剩余時(shí)間片繼續(xù)執(zhí)行,所以會(huì)先輸出 9, 之后再依次執(zhí)行 P 隊(duì)列中其它的 g。
方法一:
方法二:
[圖片上傳失敗...(image-4ef445-1594976286098)]
方法1:to_days,返回給的日期從0開(kāi)始算的天數(shù)。
方法2:data_add。向日期添加指定時(shí)間間隔
[圖片上傳失敗...(image-b67b10-1594976286098)]
文章名稱(chēng):go語(yǔ)言reset方法,go get 語(yǔ)法
轉(zhuǎn)載注明:http://jinyejixie.com/article48/hsddhp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站維護(hù)、手機(jī)網(wǎng)站建設(shè)、微信小程序、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)