这是我参与「第五届青训营 」伴学笔记创作活动的第1天
1包
package main
import "fmt"
func main(){
fmt.Println("Hello world") }
- 第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
2.下一行 import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。
$ go run hello.go Hello, World!
$ go build hello.go
$ ls
hello hello.go
$ ./hello
Hello, World! 2变量,常量,运算符
Go变量声明
Go语言声明的变量除了全局变量,必须使用
var 变量名 变量类型 //var a int=10 ,类型可省,自动判断 或者 变量名:=类型(值) // b:=float32(1.2)
intVal := 1 相等于:
var intVal int
intVal =1
批量声明 var (
a int
b string .... )
空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。
常量 const s string ="hello" //可省略类型, const会自动判断
iota用法
const (
a = iota //0
b //1
c //2
d = "ha" //独立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢复计数,不然下面的都是100
_ /跳过忽略8
i //9
)
const (
i=1<<iota //左移0位,所以还是1 ,i=1<<n*iota,左移0*n位
j //左移1位,2
k //左移2位,4
l
)
多个iota定义在一行 const (
a, b = iota + 1, iota + 2 //1,2
c, d //2,3
e, f //3,4
)
运算符 与C语言基本一致 算术运算符里的自增,自减,只能右自增自减, 如i++可以,++i不行 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符:&引用和指针*
3条件语句和循环语句 条件语句
if 表达式1 { //这个{必须和判断表达式1在同一行 ,表达式1不用加(),加了执行中会去掉 分支1 } else if 表达式2 { //}位置无所谓 分支2 } else{ 分支3 } //整体和C一样
switch
switch var1 { //和C比,Go的switch,默认全加了break case val1: ... case val2,var3: //多种情况 ... default: ...}
switch-type常来判断某个 interface 变量中实际存储的变量类型
switch x.(type){ //
case type:
statement(s);
case type:
statement(s);
/* 你可以定义任意个数的case /
default: / 可选 */
statement(s);}
fallthrough 会强制执行后面的 case 语句,无论是否符合 select select 是 Go 中的一个控制结构,类似于 switch 语句。 select 语句只能用于通道操作,每个case必须是一个通道操作,要么是发送要么是接收 select会监听所有通道: 如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。
- 所有 channel 表达式都会被求值
- 所有被发送的表达式都会被求值
select { case <- channel1: // 执行的代码 case value := <- channel2: // 执行的代码 case channel3 <- value: // 执行的代码 ... default: // 所有通道都没有准备好,执行的代码 }
循环语句 Go 语言中的所有循环类型均可以使用for关键字来完成。 for 初始语句;条件表达式;结束语句{ 循环体语句 }
for循环的初始语句和结束语句都可以省略,例如:
func forDemo3() {
i := 0
for i < 10 { //这个时候前后两个;都可以省略,等同于while
fmt.Println(i)
i++
}}
无限循环 for { 循环体语句 } 可以通过break、goto、return、panic语句强制退出循环 Go语言中可以使用for range遍历数组、切片、字符串、map 及通道(channel)。 通过for range遍历的返回值有以下规律:
- 数组、切片、字符串返回索引和值。
- map返回键和值。
- 通道(channel)只返回通道内的值。
break 和continue可以使用标签块, 进行跳出和继续
re:
for i := 1; i <= 3; i++ {
fmt.Printf("i: %d\n", i)
for i2 := 11; i2 <= 13; i2++ {
fmt.Printf("i2: %d\n", i2)
continue re //直接continue到re的部分
}
}
结果 i: 1 i2: 11 i: 2 i2: 11 i: 3 i2: 11
goto语句通过标签进行代码间的无条件跳转