为了账号安全,请及时绑定邮箱和手机立即绑定

Go例子和成语

Go例子和成语

Go
慕容708150 2021-04-06 17:19:18
没有太多的Go语言代码可用于学习该语言,而且我敢肯定,我并不是唯一一个尝试过该语言的人。因此,如果您发现有关该语言的一些有趣信息,请在此处发布示例。我也在寻找Go中惯用的方式来做事,C / C ++思维风格“移植”到Go,有关语法的常见陷阱,真的很有趣。
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

推迟陈述


“ defer”语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻。


DeferStmt =“ defer”表达式。


表达式必须是函数或方法调用。每次执行“ defer”语句时,都会对函数调用的参数进行评估并重新保存,但不会调用该函数。延迟的函数调用将在周围函数返回之前立即以LIFO顺序执行,但是在对返回值(如果有)进行求值之后才执行。



lock(l);

defer unlock(l);  // unlocking happens before surrounding function returns


// prints 3 2 1 0 before surrounding function returns

for i := 0; i <= 3; i++ {

    defer fmt.Print(i);

}

更新:


defer现在也处理惯用方式panic在例外样方式:


package main


import "fmt"


func main() {

    f()

    fmt.Println("Returned normally from f.")

}


func f() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Println("Recovered in f", r)

        }

    }()

    fmt.Println("Calling g.")

    g(0)

    fmt.Println("Returned normally from g.")

}


func g(i int) {

    if i > 3 {

        fmt.Println("Panicking!")

        panic(fmt.Sprintf("%v", i))

    }

    defer fmt.Println("Defer in g", i)

    fmt.Println("Printing in g", i)

    g(i+1)

}


查看完整回答
反对 回复 2021-04-26
?
狐的传说

TA贡献1804条经验 获得超3个赞

Go对象文件实际上包含明文标题:


jurily@jurily ~/workspace/go/euler31 $ 6g euler31.go

jurily@jurily ~/workspace/go/euler31 $ cat euler31.6

amd64

  exports automatically generated from

  euler31.go in package "main"

    import


$$  // exports

  package main

    var main.coin [9]int

    func main.howmany (amount int, max int) (? int)

    func main.main ()

    var main.initdone· uint8

    func main.init ()


$$  // local types

  type main.dsigddd_1·1 struct { ? int }


$$


!

<binary segment>


查看完整回答
反对 回复 2021-04-26
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

我看到几个人抱怨“ for-loop”,类似“为什么i = 0; i < len; i++在这个时代必须说?”。


我不同意,我喜欢for结构。如果愿意,可以使用长版本,但是惯用的Go是


var a = []int{1, 2, 3}

for i, v := range a {

    fmt.Println(i, v)

}

该for .. range构造在所有元素上循环并提供两个值-索引i和值v。


range 也适用于地图和频道。


不过,如果您不喜欢for任何形式,则可以在以下几行中定义each,map等等:


type IntArr []int


// 'each' takes a function argument.

// The function must accept two ints, the index and value,

// and will be called on each element in turn.

func (a IntArr) each(fn func(index, value int)) {

    for i, v := range a {

        fn(i, v)

    }

}


func main() {

    var a = IntArr([]int{2, 0, 0, 9}) // create int slice and cast to IntArr

    var fnPrint = func(i, v int) {

        fmt.Println(i, ":", v)

    } // create a function


    a.each(fnPrint) // call on each element

}

印刷


0 : 2

1 : 0

2 : 0

3 : 9

我开始非常喜欢Go :)


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 274 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号