Go语言入门13(runtime包)
Posted te9uila
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言入门13(runtime包)相关的知识,希望对你有一定的参考价值。
Runtime包
GOMAXPROCS()
用来设置可以并行计算的CPU核数最大值,并返回之前的值,具体使用方法上一篇有些,这里不再赘述
Gosched()
用于让出CPU时间片,让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行
Goexit()
用于立即中止当前goroutine的运行(中止所在协程),而并不影响其他goroutine。⭐注意!Goexit()在中止当前协程前,还是会运行当前goroutine还没有执行的defer语句,切记,不允许在主函数调用Goexit(),会导致panic异常
举个栗子
// 定义两个函数,Test01和Test02
// Test02在Test01运行结束之后运行
// 并且Test02在i = 3的时候结束运行
//Test01
func Test01(wg *sync.WaitGroup)
defer func()
fmt.Println("Test01结束!")
wg.Done()
()
fmt.Println("协程01循环输出:")
for i := 0; i < 5; i++
fmt.Println("协程01 -", i)
// Test02
func Test02(wg *sync.WaitGroup)
defer func()
fmt.Println("Test02结束!")
wg.Done()
()
// 等待Test01运行结束
runtime.Gosched()
fmt.Println("协程02循环输出:")
for i := 0; i < 5; i++
if i == 3
fmt.Println("i = 3 退出!")
// 当i = 3时执行defer里的语句然后退出
runtime.Goexit()
fmt.Println("协程02 -", i)
// main函数调用
func main()
var wg sync.WaitGroup
wg.Add(2)
go Test01(&wg)
go Test02(&wg)
wg.Wait()
fmt.Println("This is main function!")
/*输出:
协程01循环输出:
协程01 - 0
协程01 - 1
协程01 - 2
协程01 - 3
协程01 - 4
Test01结束!
协程02循环输出:
协程02 - 0
协程02 - 1
协程02 - 2
i = 3 退出!
Test02结束!
This is main function!
*/
go语言入门:包
示例代码:
package main import "fmt" func main() { fmt.Println("hello, world") }
1. 包
1.1 概念
go中包的概念相当于Java中的类;
一个go文件只属于一个包,一个包可以包含多个go文件;
每个go文件的非注释的第一行都是用 package xxx; 表名这个文件属于哪个包;
package main 表示一个可独立执行的程序,相当于Java中的主类(main方法所在的类);
包名都应该使用小写字母;
根据惯例,每个目录下只包含一个包的文件;
1.2 包的依赖关系
go中的包模型采用显示依赖关系的机制达到快速编译的目的,这种机制在编译大型项目时可以显著提升编译速度,编译器只需要从后缀为 o 的文件中中提取依赖关系
如果 a.go 依赖 b.go,b.go依赖c.go,则先编译 c.go,再编译 b.go,最后编译 a.go;
1.3 导包
go程序通过 import 关键字将多个包链接到一起,如果一个go源文件需要使用其他包公开声明的变量或者函数,则需要通过 import 关键字将需要的包导入到当前文件;
导包的方式一般为 :import "包名"
import "fmt" import "os" 或者 import "fms"; import "os" 或者 import( "fmt" "os" )
或者
这种形式在使用 gofmt 后会被强制换行
import ("fmt";"os")
导包时如果以 ./开头,则在相对目录中查找;
如果以 / 开头,则在绝对路径中查找;
如果只导入包名,则在全局文件中查找;
包名冲突
导包时可以通过路径定位包的位置,所以可能存在不同路径下相同的包名,而在使用其它包时又需要以包名.标识符的形式使用,此时可以使用别名的方式用于区分两个包
package main import fm "fmt" // alias3 func main() { fm.Println("hello, world") }
如果导入了一个包却没有使用它,则在构建程序时引发错误 imported and not used:os
1.4 可见性规则
可见性规则即上面提到的 其他包公开声明的变量或者函数;
将一个包导入当前文件后,只可以使用该包中公开声明的比那辆或者函数;
当标识符(包括常量,变量,函数名,结构字段,类型等)以大写字母开头,这种标识符的对象就可以被其他包使用,相当于Java中的 public;
其他的对象则不能被其他包使用,只能在本包内使用,相当于Java中的 private;
使用其他包的变量或者函数时,必须以 包名.变量名 或者 包名.函数名 的形式使用,假如要使用 date包中的 Hour 变量,则需要以 date.Hour 的形式调用;
以上是关于Go语言入门13(runtime包)的主要内容,如果未能解决你的问题,请参考以下文章