if/else分支判断

基本结构如下:

 if condition1 {
} if condition1 { } else { } if condition1 { } else if condition2 { } else if condition3 {
} else {
}
 // main
package main import (
"fmt"
"strconv"
) func main() {
var input string
fmt.Scanf("%s", &input)
conv_input, err := strconv.Atoi(input)
if err != nil {
fmt.Println("cannot convert to int")
} else {
fmt.Println(conv_input)
}
}

sample

swich case语句

 switch var {
case var1:
case var2:
case var3:
default:
}
 var i = 0
switch i {
case 0:
fallthrough
case 1:
fmt.Println(“1”)
case 2:
fmt.Println(“2”)
default:
fmt.Println(“def”)
}

fallthrough

go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码,fallthrough不会判断下一条case的expr结果是否为true。

格式2

 var i = 0
switch {
condition1:
fmt.Println(“i > 0 and i < 10”)
condition2:
fmt.Println(“i > 10 and i < 20”)
default:
fmt.Println(“def”)
}
 var i = 0
switch {
case i > 0 && i < 10:
fmt.Println(“i > 0 and i < 10”)
case i > 10 && i < 20:
fmt.Println(“i > 10 and i < 20”)
default:
fmt.Println(“def”)
}

sample

格式3

 switch i := 0 {
case i > 0 && i < 10:
fmt.Println(“i > 0 and i < 10”)
case i > 10 && i < 20:
fmt.Println(“i > 10 and i < 20”)
default:
fmt.Println(“def”)
}
 // main
package main import (
"fmt"
"math/rand"
) func main() {
randum_num := rand.Intn(100) for {
var input int
fmt.Scanf("%d\n", &input)
input_num := input if input_num == randum_num {
fmt.Println("good guess")
break
} else if input_num > randum_num {
fmt.Println("bigger")
} else {
fmt.Println("smaller")
}
} }

sample

for 语句

写法1

for 初始化语句; 条件判断; 变量修改 {
} for i := 0 ; i < 100; i++ {
fmt.Printf(“i=%d\n”, i)
}

写法2

for  条件 {
} for true {
fmt.Println(“i > 0”)
}

写法3

str := “hello world,中国”
for i, v := range str {
fmt.Printf(“index[%d] val[%c] len[%d]\n”, i, v, len([]byte(v)))
}

break/continue语句

str := “hello world,中国”
for i, v := range str {
if i > 2 {
continue
}
if (i > 3) {
break }
fmt.Printf(“index[%d] val[%c] len[%d]\n”, i, v, len([]byte(v)))
}

goto/lable语句

package main
import "fmt"
func main() {
LABEL1:
for i := 0; i <= 5; i++ {
for j := 0; j <= 5; j++ {
if j == 4 {
continue LABEL1
}
fmt.Printf("i is: %d, and j is: %d\n", i, j)
}
}
} package main func main() {
i := 0
HERE:
print(i)
i++
if i == 5 {
return
}
goto HERE
}

函数

1. 声明语法:func 函数名 (参数列表) [(返回值列表)] {}

func add() {
} func add(a int, b int) {
} func add(a int, b int) int {
} func add(a int, b int) (int, int) {
} func add(a, b int) (int, int) {
}

2. golang函数特点:
a. 不支持重载,一个包不能有两个名字一样的函数
b. 函数是一等公民,函数也是一种类型,一个函数可以赋值给变量
c. 匿名函数
d. 多返回值

 package main

 import "fmt"

 func add(a, b int) int {
return a + b
} func main() { c := add
fmt.Println(c) sum := c(10, 20)
fmt.Println(sum)
if ( c == add ) {
fmt.Println(“c equal add”)
}
}

sample

 package main

 import "fmt"

 type add_func func(int, int) int

 func add(a, b int) int {
return a + b
} func operator(op add_func, a int, b int) int {
return op(a, b)
} func main() {
c := add
fmt.Println(c)
sum := operator(c, 100, 200)
fmt.Println(sum)
}

sample2

3. 函数参数传递方式:
1). 值传递
2). 引用传递

注意1:无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值的拷贝。引用传递是地址的拷贝,一般来说,拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,则性能越低
注意2:map、slice、chan、指针、interface默认以引用的方式传递

4. 命名返回值的名字

func add(a, b int) (c int) {
c = a + b
return
} func calc(a, b int) (sum int, avg int) {
sum = a + b
avg = (a +b)/2
return
}

5. _标识符,用来忽略返回值:

6. 可变参数

func add(arg…int) int {   //0个或多个参数
} func add(a int, arg…int) int { //1个或多个参数
} func add(a int, b int, arg…int) int { //2个或多个参数 } 注意:其中arg是一个slice,我们可以通过arg[index]依次访问所有参数
 func add(a int, arg ...int) int {
sum := a
for _, v := range arg {
sum += v
}
return sum
}

一个或多个数相加

7. defer用途:
1. 当函数返回时,执行defer语句。因此,可以用来做资源清理
2. 多个defer语句,按先进后出的方式执行
3. defer语句中的变量,在defer声明时就决定了。

func a() {
i := 0
defer fmt.Println(i)
i++
return
} func f() {
for i := 0; i < 5; i++ {
defer fmt.Printf(“%d “, i)
}
}
 func read() {
file := open(filename)
defer file.Close() //文件操作
}

关闭文件句柄

 func read() {
mc.Lock()
defer mc.Unlock()
//其他操作
}

锁资源释放

 func read() {
conn := openDatabase()
defer conn.Close()
//其他操作
}

数据库连接释放

go 函数和流程控制的更多相关文章

  1. MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)

    mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...

  2. 14 MySQL--事务&函数与流程控制

    一.事务 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性 场景: ...

  3. mysql:视图、触发器、事务、存储、函数、流程控制

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...

  4. Generator函数在流程控制中的应用

    扯蛋 做了两年的Nodejs全栈开发,不知道为什么跑来做游戏呢(大概是厦门nodejs不好找工作吧).用的是网易的pomelo的游戏框架.现接手了一个棋牌游戏:二十一点,不懂的规则的可以自行百度. 二 ...

  5. [MySQL数据库之Navicat.pymysql模块、视图、触发器、存储过程、函数、流程控制]

    [MySQL数据库之Navicat.pymysql模块.视图.触发器.存储过程.函数.流程控制] Navicat Navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降 ...

  6. MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)

    今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...

  7. Mysql-自带的一些功能,基本用法(视图,触发器,事务,存储过程,函数,流程控制)

    一. 视图 二. 触发器 三. 事务 四. 存储过程 五. 函数 六. 流程控制 一 .视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用 ...

  8. Go语言系列(三)- 基础函数和流程控制

    一.strings和strconv的使用 1. strings.HasPrefix(s string, prefix string) bool:判断字符串s是否以prefix开头 . 2. strin ...

  9. MySQL之视图、触发器、事务、存储、函数、流程控制

    一.视图 视图就是一个虚拟表,我们把复杂的sql语句后看到的虚拟表封装起来,给他取个名字,当我们下次使用的时候,就不用再去写复杂的sql语句,直接调用封装后的视图名字,就可以得到我们想要的表,然后就可 ...

  10. R语言学习 第四篇:函数和流程控制

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

随机推荐

  1. mail----java发送普通邮件

    package com.mail; import java.io.UnsupportedEncodingException; import java.util.Date; import java.ut ...

  2. flask 的orm

    https://www.cnblogs.com/chichung/p/9794702.html

  3. Mysql数据库命令行输入错误怎么办

    Mysql数据库命令行输入错误 缺少另一半 错误输入 ' 或 " 时,必须键入另一半才能退出命令. 缺少分号 写入语句缺少分号需要补全. 输入quit或者exit退出 ctrl+c,完全退出 ...

  4. [经典]Python 一篇学会多线程

    对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的MS-DOS时代,操作系统处理问题都是单任 ...

  5. Django框架(十一)—— 常用字段、参数、元信息、多对多关联关系

    目录 常用字段和参数 一.ORM字段 二.ORM参数 三.关系字段 1.ForeignKey 2.OneToOneFiled 3.ManyToManyField 四.元信息 五.多对多关联关系的三种方 ...

  6. Spring Boot配置随机数

    Spring Boot支持在系统加载的时候配置随机数. 添加config/random.properties文件,添加以下内容: #随机32位MD5字符串 user.random.secret=${r ...

  7. debug breakpoint with maven in eclipse

  8. sudo dpkg --configure -a无法解决的问题

    系统升级及新立得启动时出现的问题,还不能安装软件 E: dpkg 的操作被中断了, 您必须手动执行 'sudo dpkg --configure -a' 以修复这个问题. E: _cache-> ...

  9. layerui ios不适应问题

    .admin-main {-webkit-overflow-scrolling: touch; overflow: scroll; position: absolute; left: 0; top:  ...

  10. 笔记50 Mybatis快速入门(一)

    一.Mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...