你這個(gè)寫(xiě)法都錯(cuò)誤了,代碼注釋地方。
package main
import (
"fmt"
"time"
"net"
)
func main() {
addr := "127.0.0.1:8999"
go func() {
tcpaddr, err := net.ResolveTCPAddr("tcp4", addr)
if err != nil {
panic(err)
}
listen, err := net.ListenTCP("tcp", tcpaddr)
if err != nil {
panic(err)
}
for {
if conn, err := listen.Accept(); err != nil {
panic(err)
} else if conn != nil {
go func(conn net.Conn) {
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(">", string(buffer[0 : n]))
}
conn.Close()//
}(conn)
}
}
}()
time.Sleep(time.Second)
// Client
if conn, err := net.Dial("tcp", addr); err == nil {
for i := 0; i < 2; i++ {
_, err := conn.Write([]byte("hello"))
if err != nil {
fmt.Println(err)
conn.Close()
break
} else {
fmt.Println("ok")
}
// sleep 10 seconds and re-send
time.Sleep(10*time.Second)
}
} else {
panic(err)
}
}一是存指針修改方便,直接使用map[0]的語(yǔ)法修改即可,不然就只能用中間變量整個(gè)struct重新賦值。
二是如果你的struct內(nèi)容太多,建議map存指針,避免取用的時(shí)候反復(fù)拷貝。即使map[0]這種取法取出來(lái)也只是原struct的拷貝。
徹底卸載(若你是Windows, 刪除C:\Users\當(dāng)前用戶\.vscode文件夾),然后重新安裝。
package main
import (
"fmt"
"net/http"
"log"
"time"
)
func handler(res http.ResponseWriter, r *http.Request) {
fmt.Fprintln(res, "<body>")
for i := 0; i < 1000; i++ {
fmt.Fprint(res, "<script>document.body.innerHTML = ''</script>")
fmt.Fprintf(res, "%d", i)
if f, ok := res.(http.Flusher); ok {
f.Flush()
} else {
log.Println("Damn, no flush");
}
time.Sleep(1000 * time.Millisecond)
}
fmt.Fprintln(res, "</body>")
}
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}當(dāng)所有的進(jìn)程或線程都在等待資源釋放,而資源又釋放不了才會(huì)發(fā)生死鎖。
在這里main沒(méi)等待其它goroutine,自己先跑完了, 所以沒(méi)有數(shù)據(jù)流入ch,一共執(zhí)行了一個(gè)main, 并且沒(méi)有發(fā)生阻塞,所以沒(méi)有死鎖, 將代碼改成:
package main
import "sync"
func main() {
ch1 := make(chan int)
var wg sync.WaitGroup
wg.Add(1)
go func() {
ch1 <- 1
wg.Done()
}()
wg.Wait()
// <-ch1
}
就會(huì)發(fā)生死鎖
知道原因了,是go的slice的問(wèn)題,參考個(gè)問(wèn)題:
https://www.zhihu.com/questio...
根據(jù)上面的問(wèn)答,得出一個(gè)理解和一個(gè)結(jié)論
理解:
slice或者數(shù)組,其子項(xiàng)的內(nèi)存地址必定是連續(xù)的。slice的長(zhǎng)度和容量是兩個(gè)概念,長(zhǎng)度是slice中有多少個(gè)值,容量是slice中最多能存多少個(gè)值。當(dāng)slice要增加子項(xiàng)時(shí),總長(zhǎng)度不能超過(guò)容量。
結(jié)論:
append會(huì)判斷原slice容量夠不夠,不夠則創(chuàng)建一個(gè)容量為原來(lái)的兩倍的新slice,并給新slice添加元素,如果夠則直接改變原slice未使用的第一個(gè)內(nèi)存地址的值為新元素。
由結(jié)論猜想出的一種bug:
有一個(gè)slice:a,容量為4,長(zhǎng)度為3。把a(bǔ)用作append的第一個(gè)參數(shù),返回值賦予給一些新slice,則這些新slice每個(gè)子項(xiàng)的內(nèi)存地址都是一一相等的,意味著改變了任何一個(gè)slice的任意一個(gè)值,其它slice對(duì)應(yīng)的值也會(huì)跟著變
show you the code
a := make([]int,3,4)
a[0] = 0
a[1] = 1
a[2] = 2
b := append(a,10)
c := append(a,100)
c[0] = 101
fmt.Println(&a[0],&b[0],&c[0]) //4 4 0xc0423eb500 0xc0423eb500 0xc0423eb500
fmt.Println(a[0],b[0],c[0]) //101 101 101
fmt.Println(b[3],c[3]) //100 1001.如果有固定位數(shù),并且不太多的話,你可以先把所有滿足的結(jié)果列舉出來(lái),存在一個(gè)數(shù)組里,然后用需要判斷的變量與數(shù)組里的每一項(xiàng)比較。
2.如果不想列舉的話,臥槽,兄弟你這規(guī)則有點(diǎn)奇怪啊,什么鬼都能叫順子嗎~~
total小寫(xiě)的,不可導(dǎo)出,多看看文檔吧
Where("(mobile = ? or email = ?) and status <= ? ","18800000000", "test@test.com",1)
goroutine池很有必要,可以看看gf框架實(shí)現(xiàn)的grpool: http://gf.johng.cn/504458
在高并發(fā)下grpool的性能比原生的goroutine高出幾倍到數(shù)百倍,具體看下測(cè)試報(bào)告以及測(cè)試代碼。grpool支持工作線程數(shù)量限制,底層是使用channel來(lái)實(shí)現(xiàn)的。我覺(jué)得數(shù)量限不限制主要還是看業(yè)務(wù)場(chǎng)景以及硬件性能,默認(rèn)情況下一般不需要限制。
執(zhí)行順序從左到右,但左邊被賦值的變量在表達(dá)式的下一行才生效。
即 a, b = b, a+1 可理解成
temp_a = a
a = b
b = temp_a + 1
更多例子 https://golang.org/ref/spec#A...
a, b = b, a // exchange a and b
x := []int{1, 2, 3}
i := 0
i, x[i] = 1, 2 // set i = 1, x[0] = 2
i = 0
x[i], i = 2, 1 // set x[0] = 2, i = 1
x[0], x[0] = 1, 2 // set x[0] = 1, then x[0] = 2 (so x[0] == 2 at end)
x[1], x[3] = 4, 5 // set x[1] = 4, then panic setting x[3] = 5.
type Point struct { x, y int }
var p *Point
x[2], p.x = 6, 7 // set x[2] = 6, then panic setting p.x = 7
i = 2
x = []int{3, 5, 7}
for i, x[i] = range x { // set i, x[2] = 0, x[0]
break
}
// after this loop, i == 0 and x == []int{3, 5, 3}是博文有誤,LDFLAGS的-lxxx不應(yīng)該有lib前綴,我已重新整理https://github.com/meilihao/t...
目測(cè)index函數(shù)被執(zhí)行了2遍
package main
import (
"container/list"
"fmt"
)
func main() {
l1 := list.New()
l1.PushBack(1)
fmt.Println(l1.Back().Value)
l2 := *l1
l2.PushBack(2)
fmt.Println(l1.Back().Value, l2.Back().Value)
}
輸出
1
2 1golang的正則表達(dá)式不支持backreference。
https://github.com/google/re2...
https://github.com/google/re2...
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。