Golang學(xué)習(xí)筆記

十四 Slice切片

func main() {
   s := make([]int, 3, 5)
   fmt.Println(s, len(s), cap(s))
   s = append(s, 1)
   fmt.Println(s, len(s), cap(s))
   s = append(s, 1)
   fmt.Println(s, len(s), cap(s))
   s = append(s, 1)
   fmt.Println(s, len(s), cap(s))
   s = append(s, 1)

   t := make([]int, 3)
   t = append(t, 1)
   fmt.Println(t, len(t), cap(t))

   //[0 0 0] 3 5
   //[0 0 0 1] 4 5
   //[0 0 0 1 1] 5 5
   //[0 0 0 1 1 1] 6 10

   //[0 0 0 1] 4 6
}
func main() {
    a := []int{1, 2, 3, 4}
    b := a[0:2]
    fmt.Println(a, b)

    b[0] = 100
    fmt.Println(a, b)

    c := make([]int, 3)
    copy(c, a)
    fmt.Println(a, b, c)

    a[0] = 200
    fmt.Println(a, b, c)

    //[1 2 3 4] [1 2]
    //[100 2 3 4] [100 2]
    //[100 2 3 4] [100 2] [100 2 3]
    //[200 2 3 4] [200 2] [100 2 3]
}

十五 Map的三種聲明方式

func main() {
    var m map[string]string
    if m == nil {
        fmt.Println("m is nil")
    }

    m = make(map[string]string, 10)
    m["1"] = "1"
    m["s"] = "2"
    fmt.Println(m)

    o := make(map[int]string)
    o[1] = "1"
    o[200] = "2"
    fmt.Println(o)

    p := map[int]string{
        22:  "ddd",
        666: "kkk",
    }
    fmt.Println(p)

    //m is nil
    //map[1:1 s:2]
    //map[1:1 200:2]
    //map[22:ddd 666:kkk]
}

十六 Map的使用方式

func main() {
    m := make(map[string]string, 3)
    //Create
    m["China"] = "Beijing"
    m["Japan"] = "Tokyo"
    m["US"] = "NewYork"

    //Read
    for k, v := range m {
        fmt.Println(k, v)
    }

    //Update
    m["US"] = "DC"

    //Delete
    delete(m, "Japan")
    delete(m, "DDD")

    fmt.Println("============")
    for k, v := range m {
        fmt.Println(k, v)
    }
}

十七 struct的定義和使用

type myint int
type Book struct {
    title  string
    author string
}

func ChangeAuthor1(b Book) {
    b.author = "bbb"
}

func ChangeAuthor2(b *Book) {
    b.author = "bbb"
}

func main() {
    var i myint
    i = 123
    fmt.Printf("%T %v\n", i, i)

    var book Book
    book.title = "Learn go"
    book.author = "aaa"
    fmt.Printf("%T %v\n", book, book)

    ChangeAuthor1(book)
    fmt.Printf("%T %v\n", book, book)

    ChangeAuthor2(&book)
    fmt.Printf("%T %v\n", book, book)

    //main.myint 123
    //main.Book {Learn go aaa}
    //main.Book {Learn go aaa}
    //main.Book {Learn go bbb}
}

十八 面向?qū)ο箢惖谋硎?/p>

type Hero struct {
    Name  string
    Age   int
    Level int
}

func (h *Hero) GetName() string {
    return h.Name
}

func (h Hero) SetName1(name string) {
    h.Name = name
}

func (h *Hero) SetName2(name string) {
    h.Name = name
}

func (h *Hero) ShowName() {
    fmt.Println(h.Name)
}

func main() {
    myHero := Hero{"aaa", 17, 3}
    name := myHero.GetName()
    fmt.Println(name)

    myHero.SetName1("bbb")
    myHero.ShowName()

    myHero.SetName2("ccc")
    myHero.ShowName()

    //aaa
    //aaa
    //ccc
}

十九 對(duì)象的繼承

type Human struct {
    Name string
    Sex  string
}

type Superman struct {
    Human
    Sex int
}

func (h *Human) eat() {
    fmt.Println("Human eat")
}

func (s *Superman) eat() {
    fmt.Println("Superman eat")
}

func main() {
    superman := Superman{Human{"aaa", "female"}, 2}
    fmt.Println(superman.Sex)
    superman.eat()

    //2
    //Superman eat
}

二十 面向?qū)ο蟮亩鄳B(tài)的實(shí)現(xiàn)和基本要素

type AnimalIF interface {
    Sleep()
    GetType()
    GetColor() string
}

type Cat struct {
    Color string
}

func (c *Cat) Sleep() {
    fmt.Println("Cat sleep")
}

func (c *Cat) GetType() {
    fmt.Println("Type is cat")
}

func (c *Cat) GetColor() string {
    return c.Color
}

type Dog struct {
    Color string
}

func (c *Dog) Sleep() {
    fmt.Println("Dog sleep")
}

func (c *Dog) GetType() {
    fmt.Println("Type is dog")
}

func (c *Dog) GetColor() string {
    return c.Color
}

func ShowAnimal(animal AnimalIF) {
    animal.Sleep()
    animal.GetType()
    fmt.Println("Color is", animal.GetColor())
}

func main() {
    var cat, dog AnimalIF
    cat = &Cat{"red"}
    dog = &Dog{"blue"}
    cat.Sleep()
    dog.Sleep()
    ShowAnimal(cat)
    ShowAnimal(dog)

    //Cat sleep
    //Dog sleep
    //Cat sleep
    //Type is cat
    //Color is red
    //Dog sleep
    //Type is dog
    //Color is blue
}

基本要素:

  1. 父類有接口方法郑原,沒有被實(shí)現(xiàn)
  2. 多個(gè)子類砸喻,實(shí)現(xiàn)接口的所有方法
  3. 父類的類型變量的指針,指向子類的具體數(shù)據(jù)變量

二十一 Interface空接口萬能方法和類的斷言機(jī)制

type Book struct {
    author string
}

func MyFunc(arg interface{}) {
    fmt.Printf("%T %v\n", arg, arg)
    value, ok := arg.(Book)
    if ok {
        fmt.Println("It is Book:", value)
    } else {
        println("It is not Book")
    }
}

func main() {
    book := Book{"aaa"}
    MyFunc("aaa")
    MyFunc(100)
    MyFunc(3.14)
    MyFunc(book)

    //string aaa
    //It is not Book
    //int 100
    //It is not Book
    //float64 3.14
    //It is not Book
    //main.Book {aaa}
    //It is Book: {aaa}
}

二十二 變量的內(nèi)置pair結(jié)構(gòu)
一個(gè)變量在內(nèi)存中的構(gòu)造挟裂,兩部分(Type享钞,Value),Type分為Static類型(int诀蓉,string)栗竖,concrete類型

func main() {
    file, err := os.OpenFile("c:/dev/a.txt", os.O_RDWR, 0)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(file)
        var r io.Reader = file
        p := make([]byte, 1000)
        read, err := r.Read(p)
        if err != nil {
            return
        }
        fmt.Println(string(p), read)
    }

    //&{0xc000066a00}
    //abcd
    //6
}
func main() {
    book := &Book{}
    var r Reader
    var w Writer
    r = book
    r.ReadBook()
    w = r.(Writer)
    w.WriteBook()

    //Read book
    //Write book
}

二十三 反射機(jī)制

func reflectVar(arg interface{}) {
    fmt.Println(reflect.TypeOf(arg))
    fmt.Println(reflect.ValueOf(arg))
}

func main() {
    var f float64 = 3.13343
    reflectVar(f)

    //float64
    //3.13343
}
type User struct {
    Name string
    Age  int
}

func (u User) ValueCall() {
    fmt.Println("Say Hello")
}

func (u *User) PointCall() {
    fmt.Println("Say Hello")
}

func DoField(input interface{}) {
    inputType := reflect.TypeOf(input)
    inputValue := reflect.ValueOf(input)

    fmt.Println(inputType.Name(), inputValue)
    for i := 0; i < inputType.NumField(); i++ {
        field := inputType.Field(i)
        fmt.Println(i, field.Type, field.Name, inputValue.Field(i).Interface())
    }
    fmt.Println(inputValue.NumMethod())
    for i := 0; i < inputValue.NumMethod(); i++ {
        fmt.Printf("%v\n", inputValue.Method(i).Type())
    }
}

func DoMethod(input interface{}) {
    inputValue := reflect.ValueOf(input)

    fmt.Println(inputValue.NumMethod())
    for i := 0; i < inputValue.NumMethod(); i++ {
        fmt.Printf("%v\n", inputValue.Method(i))
    }
}

func main() {
    user := User{"aaa", 12}
    DoField(user)
    fmt.Println("================")
    DoMethod(&user)

    //User {aaa 12}
    //0 string Name aaa
    //1 int Age 12
    //1
    //func()
    //================
    //2
    //0x642840
    //0x642840
}

二十四 反射解析結(jié)構(gòu)體標(biāo)簽

type resume struct {
    Name string `info:"hhh"`
    Sex  string `info:"ttt"`
}

func findTag(input interface{}) {
    inputType := reflect.TypeOf(input).Elem()
    for i := 0; i < inputType.NumField(); i++ {
        fmt.Println(inputType.Field(i).Tag.Get("info"))
    }
}

func main() {
    var re resume
    findTag(&re)

    //hhh
    //ttt
}

二十五 結(jié)構(gòu)標(biāo)簽在json中的應(yīng)用

type Movie struct {
    Title  string   `json:"title"`
    Price  int      `json:"rmb"`
    Year   int      `json:"year"`
    Actors []string `json:"actors"`
}

func main() {
    movie := Movie{"喜劇之王", 60, 2012, []string{"xingye", "zhangbozhi"}}
    str, err := json.Marshal(movie)
    if err != nil {
        return
    }
    fmt.Printf("%s\n", str)
    var new_movie Movie
    err = json.Unmarshal(str, &new_movie)
    fmt.Println(err, &new_movie)
}

二十六 Goroutine基本模型和調(diào)度設(shè)計(jì)策略

二十七 創(chuàng)建Goroutine

func newTask() {
    i := 0
    for {
        fmt.Println("new goroutine:", i)
        i++
        time.Sleep(time.Second)
    }
}
func main() {
    go newTask()
    i := 0
    for {
        fmt.Println("main goroutine:", i)
        i++
        time.Sleep(time.Second)
    }

    //main goroutine: 0
    //new goroutine: 0
    //new goroutine: 1
    //main goroutine: 1
    //main goroutine: 2
    //new goroutine: 2
}
func main() {
    defer fmt.Println("main exit")
    go func() {
        defer fmt.Println("Goroutine exit")
        func() {
            defer fmt.Println("func exit")
            runtime.Goexit()
            fmt.Println("func")
        }()
        fmt.Println("Goroutine")
    }()

    for {
        time.Sleep(time.Second)
    }

    //func exit
    //Goroutine exit
}

二十八 Channel的定義和使用

func main() {
    c := make(chan string)
    go func() {
        time.Sleep(time.Second)
        c <- "555"
    }()
    str := <-c
    fmt.Println(str)

    //555
}

二十九 Channel有緩存和無緩存

func main() {
    c := make(chan int, 3)
    go func() {
        for i := 0; i < 4; i++ {
            c <- i
            fmt.Println("add channel", i, "len:", len(c), "cap:", cap(c))
        }
    }()
    time.Sleep(time.Second)
    for i := 0; i < 4; i++ {
        m := <-c
        fmt.Println("get channel", m)
    }
    time.Sleep(time.Second)

    //add channel 0 len: 1 cap: 3
    //add channel 1 len: 2 cap: 3
    //add channel 2 len: 3 cap: 3
    //get channel 0
    //get channel 1
    //get channel 2
    //get channel 3
    //add channel 3 len: 3 cap: 3
}

三十 Channel關(guān)閉

func main() {
    c := make(chan int)
    go func() {
        for i := 0; i < 5; i++ {
            c <- i
            fmt.Println("add channel", i, "len:", len(c), "cap:", cap(c))
        }
        close(c)
    }()

    for {
        if m, ok := <-c; ok {
            fmt.Println("get channel, ok", m)
        } else {
            fmt.Println("get channel, false", m)
            break
        }
    }

    //add channel 0 len: 0 cap: 0
    //get channel, ok 0
    //get channel, ok 1
    //add channel 1 len: 0 cap: 0
    //add channel 2 len: 0 cap: 0
    //get channel, ok 2
    //get channel, ok 3
    //add channel 3 len: 0 cap: 0
    //add channel 4 len: 0 cap: 0
    //get channel, ok 4
    //get channel, false 0
}

三十一 Channel關(guān)閉

func main() {
    c := make(chan int)
    go func() {
        for i := 0; i < 3; i++ {
            c <- i
            fmt.Println("add channel", i, "len:", len(c), "cap:", cap(c))
        }
        close(c)
    }()

    for d := range c {
        fmt.Println("get channel, ok", d)
    }
    fmt.Println("end")

    //get channel, ok 0
    //add channel 0 len: 0 cap: 0
    //add channel 1 len: 0 cap: 0
    //get channel, ok 1
    //get channel, ok 2
    //add channel 2 len: 0 cap: 0
    //end
}

三十二 Channel和Select

func fib(c, q chan int) {
    x, y := 1, 1
    for {
        select {
        case c <- y:
            x, y = x+y, x
        case <-q:
            return
        }
    }
}

func main() {
    c := make(chan int)
    q := make(chan int)

    go func() {
        for i := 0; i < 6; i++ {
            fmt.Println(<-c)
        }
        q <- 0
    }()
    fib(c, q)

    //1
    //1
    //2
    //3
    //5
    //8
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末暑脆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子狐肢,更是在濱河造成了極大的恐慌添吗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件处坪,死亡現(xiàn)場(chǎng)離奇詭異根资,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)同窘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門玄帕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人想邦,你說我怎么就攤上這事裤纹。” “怎么了丧没?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鹰椒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我呕童,道長(zhǎng)漆际,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任夺饲,我火速辦了婚禮奸汇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘往声。我一直安慰自己擂找,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布浩销。 她就那樣靜靜地躺著贯涎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慢洋。 梳的紋絲不亂的頭發(fā)上塘雳,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音普筹,去河邊找鬼粉捻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斑芜,可吹牛的內(nèi)容都是我干的肩刃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盈包!你這毒婦竟也來了沸呐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤呢燥,失蹤者是張志新(化名)和其女友劉穎崭添,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叛氨,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呼渣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寞埠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屁置。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仁连,靈堂內(nèi)的尸體忽然破棺而出蓝角,到底是詐尸還是另有隱情,我是刑警寧澤饭冬,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布使鹅,位于F島的核電站,受9級(jí)特大地震影響昌抠,放射性物質(zhì)發(fā)生泄漏患朱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一炊苫、第九天 我趴在偏房一處隱蔽的房頂上張望裁厅。 院中可真熱鬧,春花似錦劝评、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撞叽,卻和暖如春姻成,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愿棋。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工科展, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糠雨。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓才睹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琅攘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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