本文目录一览:
- 1、求用go语言编写的统计脚本
- 2、Golang中的benchmark
- 3、golang channel select 哪个case
- 4、go语言select的作用
- 5、Go语言基础语法(一)
- 6、golang select 为什么要for循环
求用go语言编写的统计脚本
package main
import (
"fmt"
"os"
)
func main() {
if len(os.Args) 2 {
fmt.Println("Please Input File Name!")
return
}
file, err := os.Open(os.Args[1])
if err != nil {
return
}
buff := make([]byte, 1000)
_, err = file.Read(buff)
if err != nil {
return
}
a, c, d, e, _ := Sum(buff)
fmt.Printf("a c d e \n%d %d %d %d\n", a, c, d, e)
}
func Sum(buff []byte) (a, c, d, e, def int) {
for i := 0; i len(buff); i++ {
switch buff[i] {
case 'a':
a++
case 'c':
c++
case 'd':
d++
case 'e':
e++
default:
def++
}
}
return
}
Golang中的benchmark
得到结果:
上面也可以用table driven的方式来运行多个case,这里类似于 t.Run 方法,需要使用 b.Run 方法来执行多个case比如:
golang channel select 哪个case
golang channel select 哪个case
对语句:
printf("%f",S);
在宏代换后变为:
printf("%f",3.1415926*y*y);
6) 习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。
7) 可用宏定义表示数据类型,使书写方便。
例如:
#define STU struct stu
在程序中可用STU作变量说明:
STU body[5],*p;
#define INTEGER int
在程序中即可用INTEGER作整型变量说明:
INTEGER a,b;
应注意用宏定义表示数据类型和用typedef定义数据说明符的区别。
宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。
请看下面的例子:
go语言select的作用
Go里面提供了一个关键字select,通过select可以监听channel上的数据流动。
select的用法与switch语言非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。
与switch语句相比, select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作,大致的结构如下:
在一个select语句中,Go语言会按顺序从头至尾评估每一个发送和接收的语句。
如果其中的任意一语句可以继续执行(即没有被阻塞),那么就从那些可以执行的语句中任意选择一条来使用。
如果没有任意一条语句可以执行(即所有的通道都被阻塞),那么有两种可能的情况:
如果给出了default语句,那么就会执行default语句,同时程序的执行会从select语句后的语句中恢复。
如果没有default语句,那么select语句将被阻塞,直到至少有一个通信可以进行下去
有时候会出现goroutine阻塞的情况,那么我们如何避免整个程序进入阻塞的情况呢?我们可以利用select来设置超时,通过如下的方式实现:
select总结:
作用: 用来监听 channel 上的数据流动方向。 读?写?
select实现fibonacci数列:
Go语言基础语法(一)
本文介绍一些Go语言的基础语法。
先来看一个简单的go语言代码:
go语言的注释方法:
代码执行结果:
下面来进一步介绍go的基础语法。
go语言中格式化输出可以使用 fmt 和 log 这两个标准库,
常用方法:
示例代码:
执行结果:
更多格式化方法可以访问中的fmt包。
log包实现了简单的日志服务,也提供了一些格式化输出的方法。
执行结果:
下面来介绍一下go的数据类型
下表列出了go语言的数据类型:
int、float、bool、string、数组和struct属于值类型,这些类型的变量直接指向存在内存中的值;slice、map、chan、pointer等是引用类型,存储的是一个地址,这个地址存储最终的值。
常量是在程序编译时就确定下来的值,程序运行时无法改变。
执行结果:
执行结果:
Go 语言的运算符主要包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符以及指针相关运算符。
算术运算符:
关系运算符:
逻辑运算符:
位运算符:
赋值运算符:
指针相关运算符:
下面介绍一下go语言中的if语句和switch语句。另外还有一种控制语句叫select语句,通常与通道联用,这里不做介绍。
if语法格式如下:
if ... else :
else if:
示例代码:
语法格式:
另外,添加 fallthrough 会强制执行后面的 case 语句,不管下一条case语句是否为true。
示例代码:
执行结果:
下面介绍几种循环语句:
执行结果:
执行结果:
也可以通过标记退出循环:
--THE END--
golang select 为什么要for循环
有数量不定的goroutine往channel里塞东西,然后select来接收并处理。如果所有的goroutine都完成工作,ch也接收完了,那么select就会阻塞。现在我想要跳出死循环,大概是在for循环里设置一些东西,不知道可不可以实现,或者有类似的解决方法。
go func(){ for{ select{ case v:= 《-ch: //这里打左尖括号排版就会乱,不知道是不是网站的bug DoSomething() } } }()