A Tour of Go 筆記

A Tour of Go
中文版
(方法部分看完,并發(fā)沒看)

一部分內(nèi)容在無聞視頻中講解過了,筆記戳這里
大神寫的練習(xí)解答,戳這里

Packages

  1. the package name is the same as the last element of the import path. For instance, the "math/rand" package comprises files that begin with the statement package rand.

引用如果是“name1/name2”形式,包名是name2

示例程序中是rand.Intn(10),輸出1,每次輸出不變,因?yàn)榄h(huán)境是確定的,如果想要不同輸出,要用 rand.Seed
.鏈接里有解釋,(If Seed is not called, the generator behaves as if seeded by Seed(1).)

Import

import (
    "fmt"
    "math"
)

Exported names

可見性原則
要使用 引入包中的參數(shù),肯定是大寫,不然是不能引用的
比如:math.pi ×,math.Pi √

Functions

可以一個(gè)參數(shù)或多個(gè)參數(shù),參數(shù)名在前,類型災(zāi)后

Basic types

package main

import (
    "fmt"
    "math/cmplx"
)

var (
    ToBe   bool       = false
    MaxInt uint64     = 1<<64 - 1
    z      complex128 = cmplx.Sqrt(-5 + 12i)
)

func main() {
    const f = "%T(%v)\n"
    fmt.Printf(f, ToBe, ToBe)
    fmt.Printf(f, MaxInt, MaxInt)
    fmt.Printf(f, z, z)
}

//output:bool(false)
//uint64(18446744073709551615)
//complex128((2+3i))

輸出結(jié)果的地方注意:輸出類型,值

for

無聞視頻中講過,補(bǔ)充一點(diǎn)
死循環(huán)的實(shí)現(xiàn)在go里也非常簡(jiǎn)單

func main() {
    for {
    }
}

IF FOR 練習(xí)

牛頓法開平方(以前好像在知乎上看到過一個(gè)人說自己的面試經(jīng)歷,面試一家大公司,問了開平方,他講了牛頓法,結(jié)果面試官不知道是啥,然后他就很詳細(xì)的講解了牛頓法,但是我找不到那段話了,不然可以放過來,如果有人也見過可以私我)
簡(jiǎn)單來說就是,比如開平方x,隨便猜一個(gè)結(jié)果a,a+x/2得出新的結(jié)果,每次都這樣算,得出的新結(jié)果會(huì)非常接近正確答案

package main

import (
    "fmt"
    "math"
)

func Sqrt(x float64) float64 {
    z := 1.0
    for {
        tmp := z - (z*z-x)/(2*z)
        fmt.Println(tmp)
        if tmp == z || math.Abs(tmp-z) < 0.000000000001 {
            break
        }
        z = tmp
    }
    return z
}

func main() {
    fmt.Println(Sqrt(2.0))
    fmt.Println(math.Sqrt(2.0))
}

Switch

Switch without a condition is the same as switch true.

Struct

  1. Struct fields are accessed using a dot.

  2. Struct fields can be accessed through a struct pointer.
    注意!To access the field X of a struct when we have the struct pointer p we could write(p).X. However, that notation is cumbersome, so the language permits us instead to write just p.X, without the explicit dereference.*

  3. 結(jié)構(gòu)體,可以不加*,就是不用解引用

  4. Struct Literals字面量賦值方式

type Vertex struct {
    X, Y int
}

var (
    v1 = Vertex{1, 2}  // has type Vertex
    v2 = Vertex{X: 1}  // Y:0 is implicit
)

Slice

數(shù)組和slice的區(qū)別是聲明的時(shí)候[]中有沒有規(guī)定大小!

s := []struct {  //匿名結(jié)構(gòu)體,
        i int
        b bool
    }{
//這里是slice 字面量賦值
        {2, true},
        {3, false},
        {5, true},
        {7, true},
        {11, false},
        {13, true},
    }
    fmt.Println(s)
func main() {
    var s []int
    printSlice(s)

    // append works on nil slices.
    s = append(s, 0)
    printSlice(s)

    // The slice grows as needed.
    s = append(s, 1)
    printSlice(s)

    // We can add more than one element at a time.
    //注意這里,擴(kuò)容,之前cap=2,不夠,所以cap=2*2=4, 還是不夠, cap繼續(xù)擴(kuò)容=4*2=8
    s = append(s, 2, 3, 4)
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

//輸出
len=0 cap=0 []
len=1 cap=2 [0]
len=2 cap=2 [0 1]
len=5 cap=8 [0 1 2 3 4]

Range

package main

import "fmt"

var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {
    for i, v := range pow {
        fmt.Printf("2**%d = %d\n", i, v)
    }
}

一個(gè)經(jīng)典例子,當(dāng)初我查range的時(shí)候到處都是這個(gè)例子,還有一點(diǎn)提一下,返回值想舍棄的時(shí)候用_

exercise:Slice

注意:slice內(nèi)部的slice要單獨(dú)聲明

package main

import "golang.org/x/tour/pic"

func Pic(dx, dy int) [][]uint8 {
    picture := make([][]uint8, dy)
    for i := 0; i < dy; i++ {
    //注意這里,slice內(nèi)部的slice要單獨(dú)聲明
        picture[i] = make([]uint8,dx)
        for j := 0; j < dx; j++ {
            picture[i][j] = uint8((dx + dy) / 2)
        }
    }
    return picture
}

func main() {
    pic.Show(Pic)
}

Maps

//初始化
m := make(map[string]int)
//賦值
m["Answer"] = 42
//多返回值,ok,用來判斷該key對(duì)應(yīng)的有沒有value值,返回bool
v, ok := m["Answer"]
fmt.Println("The value:", v, "Present?", ok)

map exercise

package main

import (
    "golang.org/x/tour/wc"
    "strings"
    "fmt"
)

func WordCount(s string) map[string]int {
    counter := make(map[string]int)
    arr := strings.Fields(s)
    for _, val := range arr {
        counter[val]++
        fmt.Println(counter[val],val)
    }

    return counter
}

func main() {
    wc.Test(WordCount)
}

閉包、closures

package main

import "fmt"

func adder() func(int) int {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}

func main() {
    pos, neg := adder(), adder()
    for i := 0; i < 10; i++ {
        fmt.Println(
            pos(i),
            neg(-2*i),
        )
    }
}

輸出:
0 0
1 -2
3 -6
6 -12
10 -20
15 -30
21 -42
28 -56
36 -72
45 -90

readers

package main

import (
    "fmt"
    "io"
    "strings"
)

func main() {
    r := strings.NewReader("Hello, Reader!")

    b := make([]byte, 8)
    for {
        n, err := r.Read(b)
        fmt.Printf("n = %v err = %v b = %v\n", n, err, b,string(b))
        fmt.Printf("b[:n] = %q\n", b[:n])
        if err == io.EOF {
            break
        }
    }
}

output;
n = 8 err = <nil> b = [72 101 108 108 111 44 32 82]
%!(EXTRA string=Hello, R)b[:n] = "Hello, R"
n = 6 err = <nil> b = [101 97 100 101 114 33 32 82]
%!(EXTRA string=eader! R)b[:n] = "eader!"
n = 0 err = EOF b = [101 97 100 101 114 33 32 82]
%!(EXTRA string=eader! R)b[:n] = ""
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,510評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,866評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,036評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,331評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,536評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,754評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,273評(píng)論 3 399
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,505評(píng)論 2 379

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