// 示例一 初始化语句;条件语句;修饰语句
for i:=0;i<10;i++{
}
// 示例二,只加条件判断,第一个(初始化语句)和第三个(后置语句)都是可以省略的
for ;sum<1000; {
sum += sum
无限循环
// 示例三,无限循环
for {
if condition1 {
break
}
}
遍历
如果使用 for 遍历指针数组,value 取出的指针地址为原指针地址的拷贝
// 示例一,遍历字符串
for index, char := range myString { // index 是字符的位置,char 是字符的值
fmt.Printf("index: %d, value: %s\n", index, char)
}
// 示例二,遍历 map
for key, value := range myMap {
fmt.Printf("key: %v, value: %v\n", key, value)
}
// 示例三,遍历数组/切片
for index, value := range myArray {
fmt.Printf("index: %d, value: %v", index, value)
}
常用数据结构
变量和常量
常量
// 常量
const identifier type
变量
// 变量
var identifier type
// 声明变量列表
var a,b,c bool
// 变量初始化
var a,b,c int = 1,2,3
// 短变量声明,只能在函数内使用,等价于 var a,b,c = 1, true, "test"
a,b,c := 1, true, "test"
类型转换
使用表达式 T(v) 将值 v 转换成 T 类型
// 声明并初始化一个 int 类型的变量 i
var i int = 1 // i := 1
// 将 i 转换成 float64 类型
var f float64 = float64(i) // f := float64(i)
// 将 f 转换成 uint 类型
var u uint = uint(f) // u := uint(f)
var c = make(chan int)
go prod(c)
go consume(c)
func prod(ch chan < int) {
for {ch <- 1}
}
func consume(ch <- chan int) {
for { <- ch}
}
关闭通道(close)
通道无需每次关闭
关闭的作用是告诉接受者该通道再无新数据发送
只有发送方需要关闭通道
select
当多个协程同时运行时,可通过 select 轮询多个通道
如果所有通道都阻塞则等待,如果定义了 default 则执行 default
如多个通道就绪则随机选择一个
select {
case v := <- ch1:
...
case v := <- ch2:
...
default:
...
}
Timer(定时器)
time.Ticker 以指定的时间间隔重复的向通道 C 发送时间值
为协程设置超时时间
timer := time.NewTimer(time.Second)
select {
case <- ch:
fmt.Println("received from ch")
case <- timer.C:
fmt.Println("timeout waiting from channel ch")
}