go语言基础算法 go语言技巧( 三 )


除了每个P维护的G队列以外,还有一个全局的队列,每个P会周期性地查看全局队列中是否有G待运行并将其调度到M中执行 , 全局队列中G的来源,主要有从系统调用中恢复的G 。之所以P会周期性地查看全局队列,也是为了防止全局队列中的G被饿死 。
M0
M0是启动程序后的编号为0的主线程,这个M对应的实例会在全局变量rutime.m0中,不需要在heap上分配,M0负责执行初始化操作和启动第一个G , 在之后M0就和其他的M一样了
G0
G0是每次启动一个M都会第一个创建的goroutine , G0仅用于负责调度G,G0不指向任何可执行的函数,每个M都会有一个自己的G0,在调度或系统调用时会使用G0的栈空间,全局变量的G0是M0的G0
一个G由于调度被中断,此后如何恢复?
中断的时候将寄存器里的栈信息,保存到自己的G对象里面 。当再次轮到自己执行时,将自己保存的栈信息复制到寄存器里面,这样就接着上次之后运行了 。
我这里只是根据自己的理解进行了简单的介绍,想要详细了解有关GMP的底层原理可以去看Go调度器 G-P-M 模型的设计者的文档或直接看源码
参考:()
()
Go语言编程入门时需要注意什么刚入门Go语言小白需要注意以下五点:
1、注意书写代码的一些规范吧,特别是注意大小写、英文标点符号区别等,在特别的位置写上注释 。
2、主要是理解伪代码所描述的算法 , 伪代码要注意是不能直接运行的 。
3、注意编译器版本与书籍上所介绍版本是否一致,也注意特殊符号,印刷版本可能与实际不一致 。
4、书上的版本和当前所用的版本是否一致,有些情况下书上版本在现在来用已经过时了 。
5、逻辑走通;给自己信心,其实起步阶段不难的 。
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:
【go语言基础算法 go语言技巧】示例代码:
语法格式:
另外 , 添加 fallthrough 会强制执行后面的 case 语句,不管下一条case语句是否为true 。
示例代码:
执行结果:
下面介绍几种循环语句:
执行结果:
执行结果:
也可以通过标记退出循环:
--THE END--
go语言语法(基础语法篇)import "workname/packetfolder"

推荐阅读