Go疑難雜癥

Go疑難雜癥

channel

package main

import "fmt"

func main() {
    c := make(chan int, 10)
    quit := make(chan int)
    go func() {
        size := cap(c)
        for i := 0; i < size; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()
    fibonacci(c, quit)
}

func fibonacci(ch, quit chan int) {
    x, y := 1, 1
    for {
        select {
        case ch <- x:
            x, y = y, x+y
        case <-quit:
            fmt.Println("quit")
        default:
            break
        }
    }

}

package main

import "time"

func main() {
    c := make(chan int)
    o := make(chan bool)
    go func() {
        for {
            select {
            case v := <- c:
                println(v)
            case <- time.After(5 * time.Second):
                println("timeout")
                o <- true
                break
            }
        }
    }()
    <- o
}

反射

package main

import (
    "fmt"
    "reflect"
    "strings"
)

type order struct {
    ordId      int
    customerId int
}

type employee struct {
    id      int
    name    string
    address string
    salary  int
    country string
}

func createQuery(q interface{}) {
    if reflect.ValueOf(q).Kind() == reflect.Struct {
        t := reflect.TypeOf(q).Name()
        query := fmt.Sprintf("insert into %s values(", t)
        v := reflect.ValueOf(q)
        for i := 0; i < v.NumField(); i++ {
            switch v.Field(i).Kind() {
            case reflect.Int:
                if i == 0 {
                    query = fmt.Sprintf("%s%d", query, v.Field(i).Int())
                } else {
                    query = fmt.Sprintf("%s, %d", query, v.Field(i).Int())
                }
            case reflect.String:
                if i == 0 {
                    query = fmt.Sprintf("%s\"%s\"", query, v.Field(i).String())
                } else {
                    query = fmt.Sprintf("%s, \"%s\"", query, v.Field(i).String())
                }
            default:
                fmt.Println("Unsupported type")
                return
            }
        }
        query = fmt.Sprintf("%s)", query)
        fmt.Println(query)
        return
    }

    fmt.Println("unsupported type")
}

func update(q interface{}) {
    if reflect.ValueOf(q).Kind() == reflect.Struct {
        t := reflect.TypeOf(q).Name()
        sql := fmt.Sprintf("Update %s set", t)
        v := reflect.ValueOf(q)
        size := v.NumField()
        for i := 0; i < size; i++ {
            s := strings.ToUpper(v.Type().Field(i).Name)
            switch v.Field(i).Kind() {
            case reflect.Int:
                if i == 0 {
                    sql = fmt.Sprintf("%s %s = %d", sql, s, v.Field(i).Int())
                } else {
                    sql = fmt.Sprintf("%s and %s = %d", sql, s, v.Field(i).Int())
                }
            case reflect.String:
                if i == 0 {
                    sql = fmt.Sprintf("%s %s = %s", sql, s, v.Field(i).String())
                } else {
                    sql = fmt.Sprintf("%s and %s = %s", sql, s, v.Field(i).String())
                }
            }
        }
        fmt.Println(sql)
    }
}

func main() {
    o := order{
        ordId:      456,
        customerId: 56,
    }
    createQuery(o)
    update(o)

    e := employee{
        id:      565,
        name:    "Naveen",
        address: "Coimbatore",
        salary:  90000,
        country: "India",
    }
    createQuery(e)
    update(e)
    i := 90
    createQuery(i)

}

Mutex

package main

import (
    "fmt"
    "sync"
)

var x = 0

func increment(wg *sync.WaitGroup, mutex *sync.Mutex) {
    mutex.Lock()
    x = x + 1
    mutex.Unlock()
    wg.Done()
}
func main() {
    var w sync.WaitGroup
    var m sync.Mutex
    for i := 0; i < 1000; i++ {
        w.Add(1)
        go increment(&w, &m)
    }
    w.Wait()
    fmt.Println("final value of x", x)
}

channel

package main

import (
    "fmt"
    "sync"
)

var x = 0

func increment(wg *sync.WaitGroup, ch chan bool) {
    ch <- true
    x = x + 1
    <-ch
    wg.Done()
}
func main() {
    var w sync.WaitGroup
    ch := make(chan bool, 1)
    for i := 0; i < 1000; i++ {
        w.Add(1)
        go increment(&w, ch)
    }
    w.Wait()
    fmt.Println("final value of x", x)
}

package main

import (
    "fmt"
)

func change(s ...string) {
    s[0] = "Go"
    s = append(s, "playground")
    fmt.Println(s)
}

func main() {
    welcome := []string{"hello", "world"}
    change(welcome...)
    fmt.Println(welcome)
}

package main

import (
    "fmt"
)

func mutate(s []rune) string {
    s[0] = 'a'
    return string(s)
}
func main() {
    h := "hello"
    fmt.Println(mutate([]rune(h)))
}

So forget about passing pointers to arrays around and use slices instead

package main

import (
    "fmt"
)

func modify(sls []int) {
    sls[0] = 90
}

func main() {
    a := [3]int{89, 90, 91}
    modify(a[:])
    fmt.Println(a)
}

It is also possible to create a zero struct and then assign values to its fields later.

package main

import (  
    "fmt"
)

type Employee struct {  
    firstName, lastName string
    age, salary         int
}

func main() {  
    //創(chuàng)建一個零值的結(jié)構(gòu)體件炉,不是nil凌净,可以給它賦值
    var emp7 Employee
    emp7.firstName = "Jack"
    emp7.lastName = "Adams"
    fmt.Println("Employee 7:", emp7)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市雄右,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苫昌,死亡現(xiàn)場離奇詭異,居然都是意外死亡幸海,警方通過查閱死者的電腦和手機(jī)祟身,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來物独,“玉大人袜硫,你說我怎么就攤上這事〉猜ǎ” “怎么了婉陷?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長官研。 經(jīng)常有香客問我秽澳,道長,這世上最難降的妖魔是什么戏羽? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任担神,我火速辦了婚禮,結(jié)果婚禮上蛛壳,老公的妹妹穿的比我還像新娘杏瞻。我一直安慰自己,他們只是感情好衙荐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布捞挥。 她就那樣靜靜地躺著,像睡著了一般忧吟。 火紅的嫁衣襯著肌膚如雪砌函。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天溜族,我揣著相機(jī)與錄音讹俊,去河邊找鬼。 笑死煌抒,一個胖子當(dāng)著我的面吹牛仍劈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寡壮,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贩疙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了况既?” 一聲冷哼從身側(cè)響起这溅,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棒仍,沒想到半個月后悲靴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莫其,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年癞尚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榜配。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡否纬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛋褥,到底是詐尸還是另有隱情临燃,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布烙心,位于F島的核電站膜廊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏淫茵。R本人自食惡果不足惜爪瓜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匙瘪。 院中可真熱鬧铆铆,春花似錦蝶缀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谅猾,卻和暖如春柄慰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背税娜。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工坐搔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敬矩。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓概行,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谤绳。 傳聞我的和親對象是個殘疾皇子占锯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容