A Tour of Go 笔记

A Tour of Go
中文版
(方法部分看完,并发没看)

一部分内容在无闻视频中讲解过了,笔记戳这里
大神写的练习解答,戳这里

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,每次输出不变,因为环境是确定的,如果想要不同输出,要用 rand.Seed
.链接里有解释,(If Seed is not called, the generator behaves as if seeded by Seed(1).)

Import

import (
    "fmt"
    "math"
)

Exported names

可见性原则
要使用 引入包中的参数,肯定是大写,不然是不能引用的
比如:math.pi ×,math.Pi √

Functions

可以一个参数或多个参数,参数名在前,类型灾后

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))

输出结果的地方注意:输出类型,值

for

无闻视频中讲过,补充一点
死循环的实现在go里也非常简单

func main() {
    for {
    }
}

IF FOR 练习

牛顿法开平方(以前好像在知乎上看到过一个人说自己的面试经历,面试一家大公司,问了开平方,他讲了牛顿法,结果面试官不知道是啥,然后他就很详细的讲解了牛顿法,但是我找不到那段话了,不然可以放过来,如果有人也见过可以私我)
简单来说就是,比如开平方x,随便猜一个结果a,a+x/2得出新的结果,每次都这样算,得出的新结果会非常接近正确答案

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. 结构体,可以不加*,就是不用解引用

  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

数组和slice的区别是声明的时候[]中有没有规定大小!

s := []struct {  //匿名结构体,
        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.
    //注意这里,扩容,之前cap=2,不够,所以cap=2*2=4, 还是不够, cap继续扩容=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)
    }
}

一个经典例子,当初我查range的时候到处都是这个例子,还有一点提一下,返回值想舍弃的时候用_

exercise:Slice

注意:slice内部的slice要单独声明

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内部的slice要单独声明
        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对应的有没有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] = ""
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容