1、循环控制
1.1for循环
for i := 1; i < 10; i++ {
fmt.Println("hello world!", i)
}
语法:
for 循环变量初始化;循环条件;循环变量迭代{
循环操作(语句)
}
循环变量四要素:
循环变量初始化
循环条件
循环体
循环变量迭代
细节
循环条件是返回一个布尔值的表达式
for循环的第二种使用方式
for 循环判断条件 {
循环执行语句
}
j := 1
for j < 10 {
fmt.Println("hello world!", j)
j++
}
将变量初始化和变量迭代写到其他位置
for循环的第三种使用方式
for{
循环执行语句
}
等价于for;;{}是一个无限循环,通常需要配合break语句使用。
k := 1
for {
if k <= 10 {
fmt.Println("ok~")
} else {
break
}
k++
}
Golang提供for-range的方式,可以方便遍历字符串和数组
//字符串遍历方式1-传统方式
var str string = "hello world!北京"
str2 := []rune(str) //就是把str转成[]rune
for i := 1; i < len(str); i++ {
fmt.Printf("%c\n", str[i])
}
//字符串遍历方式2-for-range
str = "abc~ok,上海"
for index, val := range str {
fmt.Printf("index=%d,val=%c\n", index, val)
}
对应for-range遍历方式而言,是按照字符方式遍历,因此如果有字符串有中文,也是ok的
1.2多重循环控制
将一个循环放在另一个循环体内,就形成了嵌套循环。在外面的for称之为外层循环在里面的for循环称为内层循环
实质上,嵌套循环就是把内层循环当成外层循环的循环体,当只有内层循环的循环条件为false是,才会完全跳出内层循环,才可结束外层的当次循环,开始下一此的循环
设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n==mn次
for i := 1; i < 10; i++ {
for j := 1; j <= i; j++ {
fmt.Print(j, "*", i, "=", i*j)
fmt.Print(" ")
}
fmt.Println()
}
2、跳转控制语句-break
随机生成1-100的一个数,知道生成了99,看看一共用了几次
编写一个无限循环控制,然后不停的随机生成数,当生成了99时,就跳出循环。
var count int = 0
for {
rand.Seed(time.Now().UnixNano())
a := rand.Intn(100) + 1
count++
fmt.Println(a)
if a == 99 {
break
}
}
fmt.Println("生成99一共使用了", count)
break语句用于终止某个语句块的执行,用于中断当前for循环或跳出switch语句
细节
break语句出现在多层嵌套的语句块中,可以通过标签指明要终止的时那一层语句块
标签的基本使用
for i := 0; i < 4; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
break
}
fmt.Println("j=", j)
}
}
3、跳转控制语句-continue
continue语句用于结束本次循环,继续执行下一次循环
continue语句出现在多层嵌套的循环语句中时,可以通过标签指明要跳过的是那一层循环,这个和前面的标签的使用规则一样
for i := 0; i < 4; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
continue
}
fmt.Println("j=", j)
}
}
4、跳转控制语句-goto
Go语言的goto语句可以无条件地转移到程序中指定的行
goto语句通常与条件语句配合使用,可用来实现条件转移,跳出循环体等功能
在Go程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,是理解和调试都产生困难
5、函数和方法
未完成某一功能的程序指令的集合,成为函数。
在Go中,函数分为:自定义函数,系统函数。
语法
func 函数名 (形参列表)(返回值类型列表){
执行语句...
return 返回值列表
}
形参列表:表示函数的输入
函数中的语句:表示为了实现某一功能代码块
函数可以有返回值,也可以没有
package main
import "fmt"
func cal(n1 float64, n2 float64, operator byte) float64 {
var res float64
switch operator {
case '+':
res = n1 + n2
case '-':
res = n1 - n2
case '*':
res = n1 * n2
case '/':
res = n1 / n2
default:
fmt.Println("操着符号错误...")
}
return res
}
func main() {
var n1 float64 = 1.2
var n2 float64 = 2.7
var operator byte = '-'
result := cal(n1, n2, operator)
fmt.Println(result)
}
6、包
包的本质实际上就是创建不同的文件夹,来存放程序文件
go的每一个文件都是属于一个包,也就是说go是以包的形式来管理文件和项目目录结构的
作用:
区分相同名字的函数、变量等标识符
当程序文件很多事,可以很好的管理项目
控制函数、变量等访问范围,及作用域
细节
再给一个文件打包时,该包对应一个文件夹,文件的包名通常和文件躲在的文件夹名一致,一般为小写字母
当一个文件要使用其它包函数或变量时,需要先引入对应的包。
引入方式:import "包名"
import (
"包名"
)
package指令在文件第一行,然后是import指令
在import包时,路径是从$GOPATH的src下开始,不用带src,编译器会自动从src下开始引入
为了让其他报的文件,可以访问到本报的函数,则该函数的首字母需要大写
在访问其他包时,语法是 包名.函数名
如果包名较长,Go支持给包取别名,注意细节,取别名后,原来的包就不能使用了
在同一包下,不能有相同的函数名,否则报重复定义
如果要编译成一个可执行文件,就需要将这个包声明为main,及package main,如果你要写一个库,包可以自己定义