Go编程基础(控制流程语句)

现在来学习下go语言中控制流程语句,区别下其他语言不同的写法。

1.for循环

Go只有for一个循环语句关键字,但支持3三种形式,条件语句每次循环都会被重新检查,因此不建议在条件语句中使用函数,尽量提前计算好条件并以变量或常量代替。左大括号必须和条件语句在同一行。

package main
import "fmt"
func main() {
    a:=getSum1()
    fmt.Println(a)
    b:=getSum2()
    fmt.Println(b)
}
func getSum2() (sum2 int) {
    sum :=1
    for ; sum <100;  {
        sum +=sum
    }
    return sum
}
func getSum1() (sum1 int) {
    sum :=0
    for i:= 0; i < 10; i++ {
        sum+=i
    }
    return sum
}

2.for是Go中“while”

package main
import "fmt"
func main() {
    sum:= 1
    for sum < 1000 {
        sum +=sum
    }
    fmt.Print(sum)
}

看在goland中显示:

image.png

3.if判断以及简写

package main
import (
    "fmt"
    "math"
)
func main() {
    fmt.Print(sqrt(2),sqrt(-4))
    fmt.Println(pow(3,3,20))
}
//注意类型的转换
func pow(x float64, n float64, lim float64) float64 {
    //这里可以把表达式写在if上
    if v := math.Pow(x, n); v < lim {
        return v
    }
}
func sqrt(x float64) (string) {
    if x < 0 {
        return sqrt(-x)+"i"
    }
    return fmt.Sprint(math.Sqrt(x))
}

4.if和else

package main
import (
    "fmt"
    "math"
)
func main() {
    fmt.Print(powTest(3,2,10))
}
//如果前面的几个参数的类型相同,则只需要在最后一个参数后面声明类型即可
func powTest(x,n, lim float64) float64 {
    if v:=math.Pow(x,n); v <lim {
        return v
    }else{
        fmt.Println(v,lim)
    }
    return lim
}

5.switch

switch可以使用任何类型或者表达式作为条件语句,不需要写break,一旦条件符合自动终止。如希望继续执行下一个case,需要使用fallthrough语句。支持一个初始化表达式(可以是并行方式),右侧需要跟分号。

package main
import "fmt"
func main() {
    a:=1
    //表达式可以写在switch后面,也可以不写
    switch {
    case a >=0:
        fmt.Println("a=0")
        //继续执行下一个case
        fallthrough
    case a >=1:
        fmt.Println("a=1")
    }
}
image.png

6.指针(重点)

Go虽然保留了指针,但与其它编程语言不同的是,在Go当中不支持指针运算以及->运算符,而直接采用.选择符来操作指针目标对象的成员。

操作符&取变量地址,使用*通过指针间接访问目标对象
默认值为nil而非NULL
package main
import "fmt"
func main() {
    a:=1
    a++
    //&是取变量的地址
    var p *int = &a
    //*是通过指针间接访问目标对象
    fmt.Print(*p)
}

7.defer关键字

Go的defer语句是用来延迟执行函数的,而且延迟发生在调用函数return之后的。而且defer执行顺序为可以理解为栈:先进后出

先解释第一句话:的defer语句是延迟执行函数的

package main
import "fmt"
func main() {
    defer fmt.Print("world!")
    fmt.Print("hello")
}
image.png

然后解释第二句话:而且延迟发生在调用函数return之后的。(可能结果会跟你想的不一样)

package main
import "fmt"
func main() {
    a:=f1()
    b:=f2()
    c:=f3()
    fmt.Print(a,b,c)
}

/**
return会做几件事:
1.给返回值赋值
2.调用defer表达式
3.返回给调用函数
 */
func f1()(result int)  {
    defer func() {
        result++
    }()
    return 0
}

/**
defer是在t赋值给r之后执行的,而defer延迟函数只改变了t的值,r不变
 */
func f2() (r int) {
    t:=5
    defer func() {
        t=t+5
    }()
    return t
}

/**
这里将r作为参数传入defer表达式
 */
func f3()(r int)  {
    defer func(r int) {
        r=r+5
    }(r)
    return 1
}
image.png

解释来自stackoverflow

image.png

参考资料

https://go-tour-zh.appspot.com/welcome/1

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