惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
Vercel News
Vercel News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
aimingoo的专栏
aimingoo的专栏
B
Blog RSS Feed
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
腾讯CDC
S
SegmentFault 最新的问题
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Hacker News
The Hacker News
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
B
Blog
IT之家
IT之家
Spread Privacy
Spread Privacy
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cisco Blogs
Recent Announcements
Recent Announcements
H
Hacker News: Front Page
AI
AI
I
InfoQ
H
Heimdal Security Blog
T
Threatpost
Cisco Talos Blog
Cisco Talos Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
W
WeLiveSecurity
SecWiki News
SecWiki News
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
T
Threat Research - Cisco Blogs
V2EX - 技术
V2EX - 技术
N
News and Events Feed by Topic
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
O
OpenAI News
阮一峰的网络日志
阮一峰的网络日志
T
Troy Hunt's Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
雷峰网
雷峰网
T
Tor Project blog
有赞技术团队
有赞技术团队
Schneier on Security
Schneier on Security
Last Week in AI
Last Week in AI

Posts on WKLKEN THINKING

apisix 中的 lrucache apisix 中的服务发现机制 apisix 中的负载均衡 apisix etcd机制 聊聊框架 关于 k8s 的 zero downtime deployment 一些建议 apisix 遇到的一些问题 关于在除夕前一天换了一个洗衣机的故事 Django DRF 性能优化 DRF 的一些实践 Part1: Serializer DRF继承关系图 Better Code: 关于接口的灵活性 新的仓库: wklken/naming 缓存使用的一些经验 Better Code: 抽象: 可扩展性与可维护性的抉择 Better Code: 异常时, 该提示用户哪些信息? Better Code: 更好的异常日志打印 Go: some libs Go: go-redis/cache升级的坑 Go: logrus性能提升 Go: gin validation 远程办公的一点总结 Go: 开发过程中的一些bug 项目管理实践: 风险驱动开发 Go: 一种error wrap调用链处理方式 漫谈技术选型 Go: 基于 apitest 做handler层单元测试 Go: go-sql-driver interpolateparams参数优化 [分享]深度工作 你需要更多的思考时间 Django项目重构小结 工作七年小结: 学习,生活及其他 [分享]bash日常: bash-utils 极客时间推广海报 2017总结: 予时光以意义 k8s APIServer源码: api注册详细细节 k8s APIServer源码: api注册主体流程 k8s APIServer源码: 服务启动 k8s APIServer源码: go-restful框架 重构 - 读书笔记(Python示例) 写给新人的沟通建议 vim 杂谈 - 关于快速编辑 vim 杂谈 - 关于移动 读书笔记-重构: 章11 处理概括关系 读书笔记-重构: 章10 简化函数调用 读书笔记-重构: 章9 简化表达式 读书笔记-重构: 章8 重新组织数据 读书笔记-重构: 章7 在对象之间搬移特性 读书笔记-重构: 章6 重新组织函数 Python 代码规范小结 [分享]关于vim ElasticSearch集群部署文档 Logstash+ElasticSearch处理mysql慢查询日志 [分享]关于代码调试DE那些事 Logstash+ElasticSearch+Kibana- 实现相对通用的数据收集分析 ELK维护的一些点(二) [分享]Python源码剖析-数据结构 一些Centos Python生产环境的部署命令 摘录<<6个月学会任何一种外语>> ELK 维护的一些点 也许是一个新的开始 一些vim的个性化配置 读书笔记-调试九法 这段时间的一些想法 Python 源码阅读 - 垃圾回收机制 我为什么要写博客 APUE笔记-第一章 UNIX基础知识 Python源码阅读-闭包的实现 Python源码阅读-内存管理机制(二) Python源码阅读-内存管理机制(一) Python-基础-数据结构小结 '活动'设计的一些trick 一些简单的Python测试题 我的tmux配置及说明【k-tmux】 Review and Restart 工作四周年小结 vim插件: surround & repeat[成对符号编辑] vim插件: gundo[时光机] vim插件: expand-region[区域选中] vim插件: quickrun[快速执行] vim插件: trailing-whitespace[行尾空格处理] vim插件: closetag[成对标签补全] vim插件: ctrlp[文件搜索] vim插件: airline[状态栏增强] vim插件: theme[主题] vim插件: tagbar[大纲式导航] vim插件: nerdcommenter[快速注释] vim插件: rainbow_parentheses[括号高亮] vim插件: syntastic[语法检查] vim插件: delimitmate[符号自动补全] vim插件: matchit[成对标签跳转] vim插件: easy-align[快速对齐] vim插件: multiple-cursors[多光标操作] vim插件: vim-signature[快速标记跳转] vim插件: easymotion[快速跳转] vim插件: vundle[管理插件] Elasticsearch几个问题的解决 分享一份 Vim 简介PPT k-vim 更新9.0版本 关于知识管理工具的思考
Golang笔记-03-控制流
2014-03-02 · via Posts on WKLKEN THINKING

控制结构分为: 条件+选择+循环

IF

1.说明

条件表达式没有括号
支持一个初始化表达式(可以是多变量初始化语句)
初始化语句中定义的都是只能在block级别中使用的局部变量,不能在block之外使用
左大括号必须和条件语句在同一行(必须与if/else在同一行)
go没有三元运算符

if判断语句条件不需要括号
在判断语句里卖弄允许声明一个变量,其作用域只在逻辑块内,其他地方不起作用
花括号一定存在,且必须与if/else在同一行

2.语法

//基本
if a > 0 {  //无括号
     dosomething()
} else if a == 0 { //必须用花括号
     doothertings()
} else {
     donothing()
}

//单行模式
if a > 0 { a += 100 } else { a -= 100 }

3.示例

package main

func main(){
    a := 10

    if a > 0 {
        a += 100
    } else if a == 0 {
        a = 0
    } else {
        a -= 100
    }
    println(a)

    b := 101
    if b > 0 { b += 100 } else { b -= 100 }
    println(b)
}

//支持一个初始化语句
if a:=1; a<10 { //允许在条件之前执行一个简单语句,由此语句定义的变量作用域仅在if/else范围内
    return a
}
if a, b := 1,2; a+b == 10 {
}

if x := computedValue(); x > 10 {
} else {
}

4.结果

110
201

注意,在有返回值的函数中,不允许将“最终的”return语句放到if … else … 结构中,否则编译失败

func example(x int) int {
    if x == 0 {
        return 5
    } else {
        return x
    }
}

FOR

for是go的"while", 只支持for关键字.有三种形式

1.语法

for init; condition; post {
    //init不支持逗号,只能平行赋值
    //condition每次循环开始都会检查,不建议在里面使用函数,建议用计算好的变量/常量代替
    //post后面必须跟花括号,每轮循环结束的时候调用
}

for i:=0; i<10; i++ {
}

-----------------------------

for condition {
    dosomething()
}

i:=1
for i<10 {
}

-----------------------------

for { //无限循环
    dosomething()
}

for {
    a++
    if a > 10 {
        break
    }
}

-----------------------------

2.说明

a. 初始化和步进表达式可以使多个值:必须使用平行赋值
    i, j:=0,len(a)-1; i<j; i,j=i+1,j-1
b.每次循环都会重新检查条件表达式

3.示例

package main

func main(){
    ss := "abcd"
    for i:=0; i<len(ss); i++ {
        println(ss[i])
    }
}

得到:

97
98
99
100

4.配合range

for循环和保留字range一起使用,完成迭代器iterator操作

string, array, slice, map, channel都可以用range进行迭代器操作

range返回序号和值,若是不想要,可以用_

  for i, c := range "abc" {
      fmt.Printf("s[%d] = %c\n", i, c)
  }

得到

  s[0] = a
  s[1] = b
  s[2] = c

SWITCH

python里面没有

1.语法

支持初始化表达式

switch a:=5; a { //默认break,匹配成功后不会自动向下执行其他case,而是跳出整个switch
    case 0:         //普通
        println(a)
    case 1, 2:      //多个分支,逗号分隔
        println(a)
    case 100:       //什么都不做
    case 5:
        println(a)
        fallthrough   //进入后面的case 进行处理,而不是跳出block
    default:
        println(a)    //默认
}
注意,不需要break来明确退出一个case,一旦条件符合,自动终止,除非使用fallthough

--------------

可以不带表达式
switch sExpr {
        case expr1: //sExpr和expr1必须类型一致,不限制为常量或者证书,可以用任何类型或表达式
            ...
}

switch {
    case 0 <= Num && Num <= 3:
        fmt.Printf("3")
}

几种形式:

a := 1
switch a {
    case 0:
        ...
}

a := 1
switch {
    case a>=0:
        ....
    case a>1:
        ....
}

switch a:=1; {
    case a>=0:
        ...
    case a>1:
        ...
}

2.替代if…else if…else…

不指定switch 条件表达式(没有条件表达式,在case语句中有),或者直接为true

  a := 5
  switch {     //两句可合并位 switch a:=5; {
      case a > 1:
          println("a")
      case a > 2:
          println("b")
      default:
          println("c")
  }

goto break continue

均可配合标签使用(标签区分大小写,若声明了没有使用会导致编译错误)

break/continue可配合标签用于多重循环跳出
goto是调整执行位置,与其他两个执行结果并不相同

1.goto

支持函数内部goto跳转

请善用

必须跳转到当前函数内定义的标签,标签名大小写敏感

func myFunc() {
    i := 0
Here:
    println(i)
    i++
    goto Here
}

2.continue

进入下一次循环

3.break

终止循环

for index := 10; index > 0; index -- {
    if index == 5 {
        break //continue
    }
}

示例

package main
func main(){
    a := 1
    LABEL1:
        println("inc a=", a)
        a += 1

    LABEL2:
        //println("here")

    for ; a < 6; {
        println(a)
        if a == 3 {
            a += 1
            continue LABEL2
        }
        if a == 5 {
            break
        }
        goto LABEL1
    }
}

结果:

inc a= 1
2
inc a= 2
3
4
inc a= 4
5