go 函数和流程控制

if/else分支判断

基本结构如下:

 1 if condition1 {
 2 }
 3
 4 if condition1 {
 5
 6 } else {
 7
 8 }
 9
10 if condition1 {
11
12 } else if condition2 {
13
14 } else if condition3 {
15 } else {
16 }

 1 // main
 2 package main
 3
 4 import (
 5     "fmt"
 6     "strconv"
 7 )
 8
 9 func main() {
10     var input string
11     fmt.Scanf("%s", &input)
12     conv_input, err := strconv.Atoi(input)
13     if err != nil {
14         fmt.Println("cannot convert to int")
15     } else {
16         fmt.Println(conv_input)
17     }
18 }

sample

swich case语句

1 switch var {
2 case var1:
3 case var2:
4 case var3:
5 default:
6 }

 1 var i = 0
 2 switch i {
 3 case 0:
 4         fallthrough
 5 case 1:
 6       fmt.Println(“1”)
 7 case 2:
 8 fmt.Println(“2”)
 9 default:
10      fmt.Println(“def”)
11 }

fallthrough

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

格式2

1 var i = 0
2 switch {
3 condition1:
4       fmt.Println(“i > 0 and i < 10”)
5 condition2:
6 fmt.Println(“i > 10 and i < 20”)
7 default:
8      fmt.Println(“def”)
9 }

1 var i = 0
2 switch {
3 case i > 0 && i < 10:
4       fmt.Println(“i > 0 and i < 10”)
5 case i > 10 && i < 20:
6 fmt.Println(“i > 10 and i < 20”)
7 default:
8      fmt.Println(“def”)
9 }

sample

格式3

1 switch i := 0 {
2 case i > 0 && i < 10:
3       fmt.Println(“i > 0 and i < 10”)
4 case i > 10 && i < 20:
5 fmt.Println(“i > 10 and i < 20”)
6 default:
7      fmt.Println(“def”)
8 }

 1 // main
 2 package main
 3
 4 import (
 5     "fmt"
 6     "math/rand"
 7 )
 8
 9 func main() {
10     randum_num := rand.Intn(100)
11
12     for {
13         var input int
14         fmt.Scanf("%d\n", &input)
15         input_num := input
16
17         if input_num == randum_num {
18             fmt.Println("good guess")
19             break
20         } else if input_num > randum_num {
21             fmt.Println("bigger")
22         } else {
23             fmt.Println("smaller")
24         }
25     }
26
27 }

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. 多返回值

 1 package main
 2
 3 import "fmt"
 4
 5 func add(a, b int) int {
 6     return a + b
 7 }
 8
 9 func main() {
10
11     c := add
12     fmt.Println(c)
13
14     sum := c(10, 20)
15     fmt.Println(sum)
16        if ( c == add ) {
17                fmt.Println(“c equal add”)
18        }
19 }

sample

 1 package main
 2
 3 import "fmt"
 4
 5 type add_func func(int, int) int
 6
 7 func add(a, b int) int {
 8     return a + b
 9 }
10
11 func operator(op add_func, a int, b int) int {
12     return op(a, b)
13 }
14
15 func main() {
16     c := add
17     fmt.Println(c)
18     sum := operator(c, 100, 200)
19     fmt.Println(sum)
20 }

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]依次访问所有参数

1 func add(a int, arg ...int) int {
2     sum := a
3     for _, v := range arg {
4         sum += v
5     }
6     return sum
7 }

一个或多个数相加

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)
            }
} 

1 func read() {
2 file := open(filename)
3 defer file.Close()
4
5 //文件操作
6 }

关闭文件句柄

1 func read() {
2 mc.Lock()
3 defer mc.Unlock()
4 //其他操作
5 }

锁资源释放

1 func read() {
2 conn := openDatabase()
3 defer conn.Close()
4 //其他操作
5 }

数据库连接释放

时间: 2024-08-25 11:49:59

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

mysql存储过程、存储函数及流程控制

存储过程 一.基本语法 create procedure sp_name([proc_parameter[,...]]) [characteristic...]routine_body begin end sp_name 表示存储过程的名字 proc_parameter 存储过程参数例表[IN OUT INOUT]三个部分组成 其中IN 表示传进来的参数 其中OUT 表示传出去的参数 其中INOUT 表示传进来但最终传回的参数 routine_body 参数是SQL代码的内容(类似于触发器的fo

C语言基础之函数和流程控制

函数和流程控制也是每个编程语言的基本概念,函数是划分模块的最小单位,良好的函数规划能直接提升软件的质量,C语言的流程控制主要由以下几个语句组成,条件分支语句.选择语句.循环语句.goto语句.return语句等. 函数的定义 一个函数包含返回值.函数名和参数列表,如下定义了一个返回值为 int 函数名为show拥有一个int类型参数的函数 int show(int param) {     printf("这是一个名为show的函数");     return 0; } 再来定义个没有

视图,触发器,事务,存储过程,函数与流程控制,索引

一.视图 1.什么是视图 虚拟表:在硬盘中没有的,通过查询在内存中拼接的表 视图:通过查询得到一张虚拟表,保存下来,下次可直接使用 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 4.删除视图 drop view teacher2course; 5.强调

视图,触发器,事物,储存过程,函数,流程控制

一视图  建表 create database o; use o; create table teacher( tid int primary key auto_increment, tname char(32) ); insert into teacher(tname) values ('张磊老师'),('李平老师'),('刘海燕老师'),('朱云海老师'),('李杰老师'); create table course( cid int primary key auto_increment, c

视图,触发器,事务,存储过程,函数,流程控制,

一,视图1,什么是视图? 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的话直接使用即可2,为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询3,怎么用? 在查询前面加 create view 视图名称 as sql语句 create view teacher_view as select tid from teacher where tname='李平老师': 强调:在硬盘中,视图只有表结构文件,没有数据文件 视图开发尽量不用 因为是在mysql里面 ,视图通常用于插叙,尽量不要

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

一. 视图 二. 触发器 三. 事务 四. 存储过程 五. 函数 六. 流程控制 一 .视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦

视图、触发器、事物、存储过程、函数、流程控制

一.视图 视图是一张虚拟表,并不是真是存在的,用户可以直接使用创建完的视图名称获取结果集,该结果集可当表使用. 1.创建视图 语法:create view 视图名称  as sql语句 注意:字段名不能重复    视图是存放至数据库当中的,且视图是为了简化查询的sql语句,但是不应该更改视图中的记录.若更改了视图中的记录,有可能会影响到原来数据库中的记录. mysql> select * from t; +----+--------+----------+ | id | NAME | passw

四十二、视图、触发器、事务、储存过程、函数、流程控制和索引等知识的应用

一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么用视图 当反复用到两张表的连接操作时,可以将连成的表当做视图保存下来,下次直接使用 3.怎么用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 删除视图:drop view teacher2course 4.注意: 在硬盘中,视图只

mysql数据库之函数、流程控制

函数 注意与存储过程的区别,mysql内置的函数只能在sql语句中使用! 参考博客:http://www.cnblogs.com/linhaifeng/articles/7495918.html#_label2 CREATE TABLE blog ( id INT PRIMARY KEY auto_increment, NAME CHAR (32), sub_time datetime ); ? INSERT INTO blog (NAME, sub_time) VALUES ('第1篇','2

mysql基础教程(四)-----事务、视图、存储过程和函数、流程控制

事务 概念 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的.而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元将会回滚.所有受到影 响的数据将返回到事物开始以前的状态:如果单元中的所 有SQL语句均执行成功,则事物被顺利执行. 存储引擎 概念 在mysql中的数据用各种不同的技术存储 在文件(或内存)中. 查看 通过 show engines: 来查看mysql支持的存储引擎. 常见引擎 在mysql中用的