分享好的golang 學習教材

build-web-application-with-golang

大神astaxie制作的學習資料build-web-application-with-golang

https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md

golang語言基礎關鍵字

1.golang? 關鍵字總共也就二十五個? 你將發(fā)現阱持,Go的世界是那么地簡潔泻蚊,設計是如此地美妙述暂,編寫Go將會是一件愉快的事情。等回過頭來,你就會發(fā)現這二十五個關鍵字是多么地親切刃鳄。

var和const參考2.2Go語言基礎里面的變量和常量申明

package和import已經有過短暫的接觸

func 用于定義函數和方法

return 用于從函數返回

defer 用于類似析構函數

go 用于并發(fā)

select 用于選擇不同類型的通訊

interface 用于定義接口孽文,參考2.6小節(jié)

struct 用于定義抽象數據類型,參考2.5小節(jié)

break璧帝、case捍岳、continue、for睬隶、fallthrough锣夹、else、if苏潜、switch银萍、goto、default這些參考2.3流程介紹里面

chan用于channel通訊

type用于聲明自定義類型

map用于聲明map類型數據

range用于讀取slice恤左、map贴唇、channel數據

close,make,new? ?Panic ,Recover

package?? ??當前文件屬于哪個包

package?(在我們的例子中是package main)這一行告訴我們當前文件屬于哪個包,而包名main則告訴我們它是一個可獨立運行的包飞袋,它在編譯后會產生可執(zhí)行文件戳气。除了main包之外,其它的包最后都會生成*.a文件(也就是包文件)并放置在$GOPATH/pkg/$GOOS_$GOARCH中(以Mac為例就是$GOPATH/pkg/darwin_amd64)巧鸭。

func? ??定義了一個main函數

func定義了一個main函數瓶您,函數體被放在{}(大括號)中,就像我們平時寫C纲仍、C++或Java時一樣呀袱。

Go使用package(和Python的模塊類似)來組織代碼。main.main()函數(這個函數位于主包)是每一個獨立的可運行程序的入口點郑叠。Go使用UTF-8字符串和標識符(因為UTF-8的發(fā)明者也就是Go的發(fā)明者之一)夜赵,所以它天生支持多語言。

var? ??定義變量

var關鍵字是Go最基本的定義變量方式锻拘,與C語言不同的是Go把變量類型放在變量名后面:定義多個變量,定義變量并初始化值,同時初始化多個變量

const?定義常量

const定義常量,可定義為數值油吭、布爾值或字符串等類型。Go 常量和一般程序語言不同的是署拟,可以指定相當多的小數位數(例如200位)婉宰, 若指定給float32自動縮短為32bit,指定給float64自動縮短為64bit

內置基礎類型Boolean,?數值類型,?字符串,?錯誤類型error類型Go的package里面還專門有一個包errors來處理錯誤:err:=errors.New("emit macho dwarf: elf header corrupted")iferr !=nil{fmt.Print(err)}? ?

有些技巧:分組聲明,iota枚舉,大寫公有,小寫私有

array就是數組推穷,它的定義方式如下:var arr[n] type? ?[n]type中心包,n表示數組的長度,type表示存儲元素的類型馒铃。

slice??“動態(tài)數組”?并不是真正意義上的動態(tài)數組蟹腾,而是一個引用類型痕惋。slice總是指向一個底層array,slice的聲明也可以像array一樣娃殖,只是不需要長度值戳。?var fslice []int? ?;ar[:n]等價于ar[0:n],ar[n:]等價于ar[n:len(ar)],ar[:]等價于ar[0:len(ar)] ;slice是引用類型,所以當引用改變其中元素的值時炉爆,其它的所有引用都會改變該值. 幾個內置函數:len 獲取slice的長度;cap 獲取slice的最大容量; append 向slice里面追加一個或者多個元素堕虹,然后返回一個和slice一樣類型的slice;copy 函數copy從源slice的src中復制元素到目標dst,并且返回復制的元素的個數

map?? ??Python中字典的概念

map也就是Python中字典的概念芬首,它的格式為map[keyType]valueType

//聲明一個key是字符串赴捞,值為int的字典,這種方式的聲明需要在使用之前使用make初始化

varnumbersmap[string]int

幾個點:

map是無序的,?

map的長度是不固定的,也就是和slice一樣郁稍,也是一種引用類型,len函;

它不是thread-safe赦政,在多個go-routine存取時,必須使用mutex lock機制;通過delete刪除map的元素:

make用于內建類型(map耀怜、slice?和channel)的內存分配。make只能創(chuàng)建slice封寞、map和channel然评,并且返回一個有初始值(非零)的T類型,而不是*T狈究。

(關于“零值”碗淌,所指并非是空值,而是一種“變量未填充前”的默認值抖锥,通常為0亿眠。 此處羅列 部分類型 的 “零值”)

int0

int80

int320

int640

uint0x0

rune0//rune的實際類型是 int32

byte0x0//byte的實際類型是 uint8

float320//長度為 4 byte

float640//長度為 8 byte

boolfalse

string""

new用于各種類型的內存分配。new(T)分配了零值填充的T類型的內存空間磅废,并且返回其地址纳像,即一個*T類型的值。用Go的術語說拯勉,它返回了一個指針竟趾,指向新分配的類型T的零值。有一點非常重要:new返回指針宫峦。

if? ??滿足條件就做某事岔帽,

if也許是各種編程語言中最常見的了,它的語法概括起來就是:如果滿足條件就做某事导绷,否則做另一件事犀勒。

Go里面if條件判斷語句中不需要括號?ifx >10{

if還有一個強大的地方就是條件判斷語句里面允許聲明一個變量,這個變量的作用域只能在該條件邏輯塊內,其他地方就不起作用了ifx:=computedValue(); x >10{

;多個條件?}elseifinteger <3{

else if? ??否則做另一件事

goto? ??跳轉到當前函數內定義的標簽

goto跳轉到必須在當前函數內定義的標簽贾费。例如假設這樣一個循環(huán):??標簽名是大小寫敏感的钦购。

funcmyFunc() {i:=0Here://這行的第一個詞,以冒號結束作為標簽println(i)i++gotoHere//跳轉到Here去}

for? ???控制邏輯

for強大的一個控制邏輯褂萧,它既可以用來循環(huán)讀取數據押桃,又可以當作while(golang 沒有while)來控制邏輯,還能迭代操作forexpression1; expression2; expression3 {

expression1箱玷、expression2和expression3都是表達式怨规,其中expression1和expression3是變量聲明或者函數調用返回值之類的陌宿,expression2是用來條件判斷锡足,expression1在循環(huán)開始之前調用,expression3在每輪循環(huán)結束之時調用壳坪。

break? 跳出當前循環(huán)

break操作是跳出當前循環(huán),當嵌套過深的時候舶得,break可以配合標簽使用,即跳轉至標簽所指定的位置

break和continue還可以跟著標號爽蝴,用來跳到多重循環(huán)中的外層循環(huán)

continue? ??跳過本次循環(huán)

need-to-insert-img

range ? ??配合for 讀取slice,map 和channel

range?for配合range可以用于讀取slice和map的數據:

fork,v:=rangemap{fmt.Println("map's key:",k)fmt.Println("map's val:",v)}//通過range沐批,像操作slice或者map一樣操作緩存類型的channel,請看下面的例子 for i := range c能夠不斷的讀取channel里面的數據蝎亚,直到該channel被顯式的關閉九孩。c:=make(chanint,10)gofibonacci(cap(c),c)fori:=rangec{fmt.Println(i)? }

?Go 支持 “多值返回”, 而對于“聲明而未被調用”的變量, 編譯器會報錯, 在這種情況下, 可以使用_來丟棄不需要的返回值 例如??for_,v:=rangemap{

switch?? ?? 處理多個條件的邏輯處理

switch? 處理多個條件的邏輯處理, case 匹配項,?default沒有匹配的默認條件

case ? ??匹配項

default? ??沒有匹配的默認條件

switchsExpr{caseexpr1:someinstructionscaseexpr2:someotherinstructionscaseexpr3:someotherinstructionsdefault:othercode}

sExpr和expr1、expr2发框、expr3的類型必須一致躺彬。Go的switch非常靈活,表達式不必是常量或整數梅惯,執(zhí)行的過程從上至下宪拥,直到找到匹配項;而如果switch沒有表達式铣减,它會匹配true她君。

case2,3,4:

我們把很多值聚合在了一個case里面,同時葫哗,Go里面switch默認相當于每個case最后帶有break缔刹,匹配成功后不會自動向下執(zhí)行其他case,而是跳出整個switch, 但是可以使用

fallthrough強制執(zhí)行后面的case代碼劣针。

fallthrough? ??強制執(zhí)行后面的case代碼校镐。

func? ??聲明函數

func來聲明函數

funcfuncName(input1type1,input2type2) (output1type1,output2type2) {//這里是處理邏輯代碼//返回多個值returnvalue1,value2}

關鍵字func用來聲明一個函數funcName

函數可以有一個或者多個參數,每個參數后面帶有類型酿秸,通過,分隔

函數可以返回多個值

上面返回值聲明了兩個變量output1和output2灭翔,如果你不想聲明也可以,直接就兩個類型

如果只有一個返回值且不聲明返回值變量,那么你可以省略 包括返回值 的括號

如果沒有返回值肝箱,那么就直接省略最后的返回信息

如果有返回值哄褒, 那么必須在函數的外層添加return語句

return ? ??表明函數返回值

幾個特性?

多個返回值

funcSumAndProduct(A,Bint) (int,int) {

returnA+B, A*B

}

變參

funcmyfunc(arg...int) {}? //for_,n:=rangearg {

傳值與傳指針

funcadd1(aint)int{//返回一個新值//簡單的一個函數,實現了參數+1的操作funcadd1(a*int)int{// 請注意煌张,*a=*a+1// 修改了a的值return*a// 返回新值}x1:=add1(&x)// 調用 add1(&x) 傳x的地址

變量在內存中是存放于一定地址上的呐赡,修改變量實際是修改變量地址處的內存。只有add1函數知道x變量所在的地址骏融,才能修改x變量的值链嘀。所以我們需要將x所在地址&x傳入函數,并將函數的參數的類型由int改為*int档玻,即改為指針類型怀泊,才能在函數中修改x變量的值。此時參數仍然是按copy傳遞的误趴,只是copy的是一個指針霹琼。

底傳指針有什么好處:

傳指針使得多個函數能操作同一個對象。

傳指針比較輕量級 (8bytes),只是傳內存地址凉当,我們可以用指針傳遞體積大的結構體

Go語言中channel枣申,slice,map這三種類型的實現機制類似指針看杭,所以可以直接傳遞忠藤,而不用取地址后傳遞指針

Go中函數也是一種變量,我們可以通過type來定義它楼雹,

type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])

defer?? ???延遲(defer)語句

defer?延遲(defer)語句模孩,你可以在函數中添加多個defer語句。當函數執(zhí)行到最后時烘豹,這些defer語句會按照逆序執(zhí)行瓜贾,最后該函數返回。defer后指定的函數會在函數退出前調用携悯。

Go沒有像Java那樣的異常機制祭芦,它不能拋出異常,而是使用了panic和recover機制憔鬼。你的代碼中應當沒有龟劲,或者很少有panic的東西。這是個強大的工具轴或,請明智地使用它

Panic?是一個內建函數昌跌,可以中斷原有的控制流程,進入一個panic狀態(tài)中照雁。當函數F調用panic蚕愤,函數F的執(zhí)行被中斷,但是F中的延遲函數會正常執(zhí)行,然后F返回到調用它的地方萍诱。在調用的地方悬嗓,F的行為就像調用了panic。這一過程繼續(xù)向上裕坊,直到發(fā)生panic的goroutine中所有調用的函數返回包竹,此時程序退出。panic可以直接調用panic產生籍凝。也可以由運行時錯誤產生周瞎,例如訪問越界的數組。

Recover? ??是一個內建的函數饵蒂,可以讓進入panic狀態(tài)的goroutine恢復過來声诸。recover僅在延遲函數中有效。在正常的執(zhí)行過程中苹享,調用recover會返回nil双絮,并且沒有其它任何效果。如果當前的goroutine陷入panic狀態(tài)得问,調用recover可以捕獲到panic的輸入值,并且恢復正常的執(zhí)行软免。

///這個函數演示了如何在過程中使用panicvaruser=os.Getenv("USER")funcinit() {ifuser==""{panic("no value for $USER")? }}//下面這個函數檢查作為其參數的函數在執(zhí)行時是否會產生panic:functhrowsPanic(ffunc()) (bbool) {deferfunc() {ifx:=recover();x!=nil{b=true}? }()f()//執(zhí)行函數f宫纬,如果f中出現了panic,那么就可以恢復回來return}

Go里面有兩個保留的函數:init函數(能夠應用于所有的package)和main函數(只能應用于package main)膏萧。每個package中的init函數都是可選的漓骚,但package main就必須包含一個main函數惧笛。

將其它包導入進來延赌,然后再對這些包中的包級常量和變量進行初始化,接著執(zhí)行init函數(如果有的話)库倘,依次類推曹锨。等所有被導入的包都加載完畢了孤个,就會開始對main包中的包級常量和變量進行初始化,然后執(zhí)行main包中的init函數(如果存在的話)沛简,最后執(zhí)行main函數齐鲤。

import? ??import這個命令用來導入包文件

相對路徑

import “./model” //當前文件同一目錄的model目錄,但是不建議這種方式來import

絕對路徑

import “shorturl/model” //加載gopath/src/shorturl/model模塊

一些特殊的import

點操作點操作的含義就是這個包導入之后在你調用這個包的函數時椒楣,你可以省略前綴的包名给郊,也就是前面你調用的fmt.Println("hello world")可以省略的寫成Println("hello world")

別名操作?別名操作顧名思義我們可以把包命名成另一個我們用起來容易記憶的名字.?別名操作的話調用包函數時前綴變成了我們的前綴

_操作??_操作其實是引入該包,而不直接使用包里面的函數捧灰,而是調用了該包里面的init函數淆九。

import("database/sql"_"github.com/ziutek/mymysql/godrv")

struct?聲明新的類型

struct?聲明新的類型,作為其它類型的屬性或字段的容器我們可以創(chuàng)建一個自定義類型person代表一個人的實體。這個實體擁有屬性:姓名和年齡炭庙。這樣的類型我們稱之struct跪另。如下代碼所示:

typepersonstruct{namestringageint}varPperson// P現在就是person類型的變量了P.name="Astaxie"http:// 賦值"Astaxie"給P的name屬性.///匿名字段? 最外層的優(yōu)先訪問typeStudentstruct{Human// 匿名字段,那么默認Student就包含了Human的所有字段specialitystring}mark:=Student{Human{"Mark",25,120},"Computer Science"}mark.age=46// 返回的是 mark.Human.age

按照順序提供初始化值

P := person{"Tom", 25}

通過field:value的方式初始化煤搜,這樣可以任意順序

P := person{age:24, name:"Tom"}

當然也可以通過new函數分配一個指針免绿,此處P的類型為*person

P := new(person)

method? ??函數的另一種形態(tài),帶有接收者的函數.?method是附屬在一個給定的類型上的擦盾,他的語法和函數的聲明語法幾乎一樣嘲驾,只是在func后面增加了一個receiver(也就是method所依從的主體)。

func (r ReceiverType) funcName(parameters) (results)

雖然method的名字一模一樣迹卢,但是如果接收者不一樣辽故,那么method就不一樣

method里面可以訪問接收者的字段

調用method通過.訪問,就像struct里面訪問字段一樣

指針作為receiverGo知道receiver是指針腐碱,他自動幫你轉

method繼承如果匿名字段實現了一個method誊垢,那么包含這個匿名字段的struct也能調用該method。

method重寫我們可以在struct上面定義一個method症见,重寫了匿名字段的方法,go語言會根據receiver,優(yōu)先調用最外層的method (最外層的優(yōu)先訪問)

interface? ? 接口

interface? ??interface是一組method簽名的組合喂走,我們通過interface來定義對象的一組行為。它讓面向對象谋作,內容組織實現非常的方便

interface類型interface類型定義了一組方法芋肠,如果某個對象實現了某個接口的所有方法,則此對象就實現了此接口

// 定義interfacetypeMeninterface{SayHi()Sing(lyricsstring)Guzzle(beerSteinstring)}

任意的類型都實現了空interface(我們這樣定義:interface{})遵蚜,也就是包含0個method的interface帖池。空interface在我們需要存儲任意類型的數值的時候相當有用吭净,因為它可以存儲任意類型的數值睡汹。它有點類似于C語言的void*類型。

interface函數參數interface的變量可以持有任意實現該interface類型的對象寂殉,這給我們編寫函數(包括method)提供了一些額外的思考囚巴,我們是不是可以通過定義interface參數,讓函數接受各種類型的參數

interface變量存儲的類型? ??

Comma-ok斷言ifvalue,ok:=element.(int); ok {

switch測試? ??switchvalue:=element.(type) {

caseint:

嵌入interface? ? 類似Struct時學習的匿名字段不撑,如果一個interface1作為interface2的一個嵌入字段文兢,那么interface2隱式的包含了interface1里面的method。

反射運用reflect包

使用reflect一般分成三步

1.首先需要把它轉化成reflect對象(reflect.Type或者reflect.Value焕檬,根據不同的情況調用不同的函數)姆坚。這兩種獲取方式如下:

t:=reflect.TypeOf(i)//得到類型的元數據,通過t我們能獲取類型定義里面的所有元素

v:=reflect.ValueOf(i)//得到實際的值,通過v我們獲取存儲在里面的值实愚,還可以去改變值

2.轉化為reflect對象之后我們就可以進行一些操作了兼呵,也就是將reflect對象轉化成相應的值兔辅,例如

tag:=t.Elem().Field(0).Tag//獲取定義在struct里面的標簽

name:=v.Elem().Field(0).String()//獲取存儲在第一個字段里面的值

3.獲取反射值能返回相應的類型和數值

varxfloat64=3.4

v:=reflect.ValueOf(x)

fmt.Println("type:", v.Type())

fmt.Println("kind is float64:", v.Kind() == reflect.Float64)

fmt.Println("value:", v.Float())

反射的話,那么反射的字段必須是可修改的??p:=reflect.ValueOf(&x)

type? ? 申明類型 ,stuct,接口, switch測試

類型包含array,slice ,map,int..等等,也可以新建的類型

typetestIntfunc(int)bool// 聲明了一個函數類型typepersonstruct{//聲明struct 類型namestringageint}typeElderlyGentinterface{//申明接口類型SayHi()Sing(songstring)SpendSalary(amountfloat32)}list:=make(List,3)// switch 測試list[0]=1//an intlist[1]="Hello"http://a stringlist[2]=Person{"Dennis",70}forindex,element:=rangelist{switchvalue:=element.(type) {caseint:fmt.Printf("list[%d] is an int and its value is %d\n",index,value)casestring:fmt.Printf("list[%d] is a string and its value is %s\n",index,value)casePerson:fmt.Printf("list[%d] is a Person and its value is %s\n",index,value)default:fmt.Println("list[%d] is of a different type",index)? ? }}

go?? ??goroutine?協程

go? ??Go的runtime管理的一個線程管理器击喂。goroutine通過go關鍵字實現了维苔,其實就是一個普通的函數.goroutine是Go并行設計的核心。goroutine說到底其實就是協程懂昂,但是它比線程更小介时,十幾個goroutine可能體現在底層就是五六個線程,Go語言內部幫你實現了這些goroutine之間的內存共享凌彬。執(zhí)行goroutine只需極少的棧內存(大概是4~5KB)沸柔,當然會根據相應的數據伸縮。也正因為如此铲敛,可同時運行成千上萬個并發(fā)任務褐澎。goroutine比thread更易用、更高效伐蒋、更輕便工三。? ??

不要通過共享來通信,而要通過通信來共享先鱼。

chan? ??通信機制

chan? ??通信機制channel俭正。channel可以與Unix shell 中的雙向管道做類比:可以通過它發(fā)送或者接收值。這些值只能是特定的類型:channel類型型型。定義一個channel時段审,也需要定義發(fā)送到channel的值的類型。注意闹蒜,必須使用make 創(chuàng)建channel:

ci:=make(chanint)cs:=make(chanstring)cf:=make(chaninterface{})//channel通過操作符<-來接收和發(fā)送數據ch<-v// 發(fā)送v到channel ch.v:=<-ch// 從ch中接收數據,并賦值給v

默認情況下抑淫,channel接收和發(fā)送數據都是阻塞的绷落,除非另一端已經準備好,這樣就使得Goroutines同步變的更加的簡單始苇,而不需要顯式的lock砌烁。所謂阻塞,也就是如果讀却呤健(value := <-ch)它將會被阻塞函喉,直到有數據接收。其次荣月,任何發(fā)送(ch<-5)將會被阻塞管呵,直到數據被讀出。無緩沖channel是在多個goroutine之間同步很棒的工具哺窄。

Buffered Channelsch:= make(chan bool, 4)捐下,創(chuàng)建了可以存儲4個元素的bool 型channel账锹。在這個channel 中,前4個元素可以無阻塞的寫入坷襟。當寫入第5個元素時奸柬,代碼將會阻塞,直到其他goroutine從channel 中讀取一些元素婴程,騰出空間廓奕。? ??ch:=make(chantype, value)

當 value = 0 時,channel 是無緩沖阻塞讀寫的档叔,當value > 0 時桌粉,channel 有緩沖、是非阻塞的蹲蒲,直到寫滿 value 個元素才阻塞寫入番甩。

range,像操作slice或者map一樣操作緩存類型的channel届搁,?fori:=rangec {

close?? ??關閉channel

生產者通過內置函數close關閉channel缘薛。關閉channel之后就無法再發(fā)送任何數據了,在消費方可以通過語法v, ok := <-ch測試channel是否被關閉卡睦。如果ok返回false宴胧,那么說明channel已經沒有任何數據并且已經被關閉。

記住應該在生產者的地方關閉channel表锻,而不是消費的地方去關閉它恕齐,這樣容易引起panic

另外記住一點的就是channel不像文件之類的,不需要經常去關閉瞬逊,只有當你確實沒有任何發(fā)送數據了显歧,或者你想顯式的結束range循環(huán)之類的

select? ??可以監(jiān)聽channel上的數據流動

select? ??可以監(jiān)聽channel上的數據流動。select默認是阻塞的确镊,只有當監(jiān)聽的channel中有發(fā)送或接收可以進行時才會運行士骤,當多個channel都準備好的時候,select是隨機的選擇一個執(zhí)行的蕾域。

funcfibonacci(c,quitchanint) {x,y:=1,1for{select{casec<-x:x,y=y,x+ycase<-quit:fmt.Println("quit")return}? }}//select來設置超時? case <- time.After(5 * time.Second): // 這個是channel啊select{casev:=<-c:println(v)case<-time.After(5*time.Second):println("timeout")o<-truebreak}

runtime goroutine ? ??//特殊強調

runtime包中有幾個處理goroutine的函數:

Goexit

退出當前執(zhí)行的goroutine拷肌,但是defer函數還會繼續(xù)調用

Gosched

讓出當前goroutine的執(zhí)行權限,調度器安排其他等待的任務運行旨巷,并在下次某個時候從該位置恢復執(zhí)行巨缘。

NumCPU

返回 CPU 核數量

NumGoroutine

返回正在執(zhí)行和排隊的任務總數

GOMAXPROCS

用來設置可以并行計算的CPU核數的最大值,并返回之前的值采呐。

https://www.yuque.com/liujunjie/pshhng/gfsb9n

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末若锁,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子懈万,更是在濱河造成了極大的恐慌拴清,老刑警劉巖靶病,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異口予,居然都是意外死亡娄周,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進店門沪停,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煤辨,“玉大人,你說我怎么就攤上這事木张≈诒妫” “怎么了?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵舷礼,是天一觀的道長鹃彻。 經常有香客問我,道長妻献,這世上最難降的妖魔是什么蛛株? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮育拨,結果婚禮上谨履,老公的妹妹穿的比我還像新娘。我一直安慰自己熬丧,他們只是感情好笋粟,可當我...
    茶點故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著析蝴,像睡著了一般害捕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闷畸,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天吨艇,我揣著相機與錄音,去河邊找鬼腾啥。 笑死,一個胖子當著我的面吹牛冯吓,可吹牛的內容都是我干的倘待。 我是一名探鬼主播,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼组贺,長吁一口氣:“原來是場噩夢啊……” “哼凸舵!你這毒婦竟也來了?” 一聲冷哼從身側響起失尖,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤啊奄,失蹤者是張志新(化名)和其女友劉穎渐苏,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體菇夸,經...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡琼富,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了庄新。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞠眉。...
    茶點故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖择诈,靈堂內的尸體忽然破棺而出械蹋,到底是詐尸還是另有隱情,我是刑警寧澤羞芍,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布哗戈,位于F島的核電站,受9級特大地震影響荷科,放射性物質發(fā)生泄漏唯咬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一步做、第九天 我趴在偏房一處隱蔽的房頂上張望副渴。 院中可真熱鬧,春花似錦全度、人聲如沸煮剧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勉盅。三九已至,卻和暖如春顶掉,著一層夾襖步出監(jiān)牢的瞬間草娜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工痒筒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宰闰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓簿透,卻偏偏與公主長得像移袍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子老充,可洞房花燭夜當晚...
    茶點故事閱讀 43,435評論 2 348

推薦閱讀更多精彩內容

  • Chapter 8 Goroutines and Channels Go enable two styles of...
    SongLiang閱讀 1,576評論 0 3
  • 環(huán)境搭建 Golang在Mac OS上的環(huán)境配置 使用Visual Studio Code輔助Go源碼編寫 VS ...
    隕石墜滅閱讀 5,773評論 0 5
  • 變量 var num int;var num int = 1,var a,b int;var a,b int = ...
    明明就_c565閱讀 404評論 0 0
  • 語言介紹 Go(又稱Golang)是Google開發(fā)的一種靜態(tài)強類型葡盗、編譯型、并發(fā)型啡浊,并具有垃圾回收功能的編程語言...
    hewolf閱讀 1,251評論 0 0
  • 1.安裝 https://studygolang.com/dl 2.使用vscode編輯器安裝go插件 3.go語...
    go含羞草閱讀 1,540評論 0 6