go 函数和流程控制
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 函数和流程控制的更多相关文章
- MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)
mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...
- 14 MySQL--事务&函数与流程控制
一.事务 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性 场景: ...
- mysql:视图、触发器、事务、存储、函数、流程控制
阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...
- Generator函数在流程控制中的应用
扯蛋 做了两年的Nodejs全栈开发,不知道为什么跑来做游戏呢(大概是厦门nodejs不好找工作吧).用的是网易的pomelo的游戏框架.现接手了一个棋牌游戏:二十一点,不懂的规则的可以自行百度. 二 ...
- [MySQL数据库之Navicat.pymysql模块、视图、触发器、存储过程、函数、流程控制]
[MySQL数据库之Navicat.pymysql模块.视图.触发器.存储过程.函数.流程控制] Navicat Navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降 ...
- MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)
今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...
- Mysql-自带的一些功能,基本用法(视图,触发器,事务,存储过程,函数,流程控制)
一. 视图 二. 触发器 三. 事务 四. 存储过程 五. 函数 六. 流程控制 一 .视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用 ...
- Go语言系列(三)- 基础函数和流程控制
一.strings和strconv的使用 1. strings.HasPrefix(s string, prefix string) bool:判断字符串s是否以prefix开头 . 2. strin ...
- MySQL之视图、触发器、事务、存储、函数、流程控制
一.视图 视图就是一个虚拟表,我们把复杂的sql语句后看到的虚拟表封装起来,给他取个名字,当我们下次使用的时候,就不用再去写复杂的sql语句,直接调用封装后的视图名字,就可以得到我们想要的表,然后就可 ...
- R语言学习 第四篇:函数和流程控制
变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...
随机推荐
- leetcode 596 BUG笔记
There is a table courses with columns: student and class Please list out all classes which have more ...
- ios网络学习------2 用非代理方法实现同步post请求
#pragma mark - 这是私有方法,尽量不要再方法中直接使用属性,由于一般来说属性都是和界面关联的,我们能够通过參数的方式来使用属性 #pragma mark post登录方法 -(void) ...
- DDOS到底是什么,怎么预防,看看就明白了
可怕的DDOS怎么预防 分布式拒绝服务(DDoS: distributed denial-of-service)攻击是恶意破坏目标服务器.服务或网络的正常通信量的企图,其方法是用大量Internet通 ...
- Flask理论基础(一)加载配置文件
一.修改/新增配置项 1.使用配置文件 app.config.from_pyfile("config.cfg") 如上 config.cfg 可以是任意后缀的文本文件,需要与app ...
- java中多线程产生死锁的原因以及解决意见
1. java中导致死锁的原因 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结 ...
- Spring常见面试题及答案解析
.说一下spring中Bean的作用域 singleton: Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象.Singleton作用域是Spri ...
- leetcood学习笔记-54-螺旋矩阵
题目描述: 第一次提交: class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: j,x = 0 ...
- leetcood学习笔记-204-计算质数
题目描述: 第一次提交;(超时): class Solution: def countPrimes(self, n: int) -> int: count = 0 for i in range( ...
- 【原理】LVM(Logical Volume Manager)动态卷管理
一张图让你学会LVM 导读 随着科技的进步,人们不知不觉的就进入了大数据的时代,数据的不断增加我们发现我们的磁盘越来越不够用了,接下来就是令人头疼的事情--加硬盘,数据的备份与还原.LVM就是Li ...
- Android中的APK,TASK,PROCESS,USERID之间的关系
开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...