• <small id="ck0wk"><meter id="ck0wk"><menuitem id="ck0wk"></menuitem></meter></small>

  • <big id="ck0wk"></big>

  • 鍍金池/ 問答/ GO問答
    伐木累 回答

    你這個寫法都錯誤了,代碼注釋地方。

    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)
        }
    }
    蟲児飛 回答
    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))
    }
    不將就 回答

    知道原因了,是go的slice的問題,參考個問題:
    https://www.zhihu.com/questio...

    根據上面的問答,得出一個理解和一個結論

    理解:
    slice或者數組,其子項的內存地址必定是連續的。slice的長度和容量是兩個概念,長度是slice中有多少個值,容量是slice中最多能存多少個值。當slice要增加子項時,總長度不能超過容量。

    結論:
    append會判斷原slice容量夠不夠,不夠則創建一個容量為原來的兩倍的新slice,并給新slice添加元素,如果夠則直接改變原slice未使用的第一個內存地址的值為新元素。

    由結論猜想出的一種bug:
    有一個slice:a,容量為4,長度為3。把a用作append的第一個參數,返回值賦予給一些新slice,則這些新slice每個子項的內存地址都是一一相等的,意味著改變了任何一個slice的任意一個值,其它slice對應的值也會跟著變

    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 100
    檸檬藍 回答

    當所有的進程或線程都在等待資源釋放,而資源又釋放不了才會發生死鎖。

    在這里main沒等待其它goroutine,自己先跑完了, 所以沒有數據流入ch,一共執行了一個main, 并且沒有發生阻塞,所以沒有死鎖, 將代碼改成:

    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
    }

    就會發生死鎖

    貓小柒 回答

    total小寫的,不可導出,多看看文檔吧

    司令 回答

    徹底卸載(若你是Windows, 刪除C:\Users\當前用戶\.vscode文件夾),然后重新安裝。

    愛是癌 回答

    執行順序從左到右,但左邊被賦值的變量在表達式的下一行才生效。

    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}
    尐飯團 回答
    1. 保證數據庫穩定(連接數被池上線限制了,數據庫不會掛)
    2. 盡量保證應用穩定(池滿了就新建,應用不會等待,但是如果連接數過多,數據庫可能掛, 從而導致應用掛)
    笑忘初 回答

    一是存指針修改方便,直接使用map[0]的語法修改即可,不然就只能用中間變量整個struct重新賦值。
    二是如果你的struct內容太多,建議map存指針,避免取用的時候反復拷貝。即使map[0]這種取法取出來也只是原struct的拷貝。

    離殤 回答

    beego的httplib組件個人感覺還不錯。

    糖豆豆 回答

    Where("(mobile = ? or email = ?) and status <= ? ","18800000000", "test@test.com",1)

    真難過 回答

    是博文有誤,LDFLAGS-lxxx不應該有lib前綴,我已重新整理https://github.com/meilihao/t...

    夏夕 回答

    goroutine池很有必要,可以看看gf框架實現的grpool: http://gf.johng.cn/504458

    在高并發下grpool的性能比原生的goroutine高出幾倍到數百倍,具體看下測試報告以及測試代碼。grpool支持工作線程數量限制,底層是使用channel來實現的。我覺得數量限不限制主要還是看業務場景以及硬件性能,默認情況下一般不需要限制。

    她愚我 回答

    1.如果有固定位數,并且不太多的話,你可以先把所有滿足的結果列舉出來,存在一個數組里,然后用需要判斷的變量與數組里的每一項比較。
    2.如果不想列舉的話,臥槽,兄弟你這規則有點奇怪啊,什么鬼都能叫順子嗎~~

    妖妖 回答

    第一種方法是最好的也是實踐中最實用的。
    proto寫的多的話,你會發現,proto中 message數據結構定義的會越來越多,所以,針對同一類型的request message,盡量可以定義的大而全,需要哪些字段就給哪些字段賦值,不需要不賦值即可,不賦值的話傳輸沒有任何消費。
    還有就是 什么層做什么事情,不要各種耦合,會很亂的。
    不要覺得第一種會啰嗦,其實一點都不浪費也不臃腫的。

    情殺 回答
    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 1
    首頁 上一頁 1 2 3 4 5 6 7 8 下一頁 尾頁
    男生女生一起差差差带痛声,插曲的痛的视频30分钟,男生和女生在一起差差的视频