golang基础
磨镜台
牢骚太盛防肠断,风物长宜放眼量。
展开
-
指针
与C语言的指针区别:不可以运算。函数返回局部变量的地址是非常安全的。(逃逸机制)原创 2018-07-29 15:59:57 · 60 阅读 · 0 评论 -
gc机制
gc机制引用计数法三色标记法:目标是为了缩短STW(stop the world)时间,提高程序时序性。基本原理扫描与标记阶段起初所有对象都是白色扫描找出所有可达对象,标记为灰色,放入待处理队列从队列提取灰色对象,将其所有引用对象标记为灰色放入队列,自身标记为黑色写屏障监视对象内存的修改,重新标色或清理阶段此时只剩下白色和黑色对象,将白色对象的内存收回。将所有黑...原创 2019-07-16 07:37:10 · 158 阅读 · 0 评论 -
golang reflect
反射:Go语言提供了一种机制,能够在运行时更新、检查变量值,调用方法,而不需要在编译时就知道这些变量具体类型。这种机制被称为反射。反射的基本使用:在运行时动态地获取变量的信息。Type类型、Value类型、Kind(类别)。在运行时动态地获取结构体信息:字段、方法。在运行时动态修改变量值,调用结构体方法。反射使用的基本原理:变量->TypeOf()->Type类型(i...原创 2019-04-15 20:45:34 · 535 阅读 · 1 评论 -
宕机和恢复
宕机: 1.Go语言的类型系统会捕获许多编译时错误。 2.Go语言运行时检测到错误(比如数组越界,引用空指针等),它就会发生宕机。 3.当宕机发生时,所有的延迟函数以倒序执行。Go语言的宕机机制让延迟执行的函数在栈清理之前调用。恢复: 退出程序通常是正确处理宕机的方式,最安全的做法还是选择性地使用recover。...原创 2018-08-02 15:04:58 · 445 阅读 · 0 评论 -
函数递归
Go语言实现了可变长度的栈,栈的大小会随着使用而增长,可达到1G左右的上限。这使我们可以安全使用递归而不用担心溢出问题。 斐波那契数列:func f(n int64) int64 { if n < 2 { return n } return f(n - 1) + f(n - 2)}...原创 2018-08-02 15:01:52 · 80 阅读 · 0 评论 -
变长参数
可变的参数个数,一般在参数列表最后的类型名称之前使用省略号“…”声明。 变长函数参数实际是一个slice:func change(nums ...int) { fmt.Println(nums, reflect.TypeOf(nums))}变长参数函数的类型和一个带有普通slice参数的函数类型是不一样的:func f(s ...int) {}func g(s []int...原创 2018-08-02 14:50:40 · 521 阅读 · 0 评论 -
函数变量
函数类型的零值是nil,调用一个空的函数变量将导致宕机。var f func()函数变量也有类型,可以赋值给变量或者传递或从其他函数中返回。var f func() = func() { fmt.Println("hello") }f1 := f函数类型本身不可比较...原创 2018-08-02 14:22:33 · 267 阅读 · 0 评论 -
new函数
使用new函数是另一种创建变量的方式。创建一个未命名的T类型变量,初始化为T类型的零值,并返回其地址。p := new(int)使用new函数创建变量和取其地址的普通局部变量没有不同,只是不需要引入声明时的一个名字,有语法上的便利。var du int p := &du p := new(int)new是一个预声明的函数,不是关键字。 常见的未命名变量...原创 2018-07-29 16:57:35 · 7198 阅读 · 0 评论 -
关于包的一些知识
包所在目录名就是包的导入路径,例如:gopl.io/chi/helloworld包存储在$GOPATH/src/gopl.io/ch1/helloworld包给它的声明提供了独立命名空间,例如:image.Decode和utf16.Decode包的初始化从包级别的变量开始,这些变量按照声明顺序初始化,在依赖解析完毕的情况,根据依赖的顺序进行。包的文档注释:package声明前面紧挨着是...原创 2018-07-29 16:53:58 · 220 阅读 · 0 评论 -
变量
变量声明的通用形式:var name type = expression其中type和expression,可省略其一。省略type,变量类型由expression决定。省略expression,变量的值是该类型的零值,对于接口和引用类型(slice、指针、map、通道、函数)是nil。对于数组或结构体,是对应成员类型的零值。短变量声明:name := expression主要...原创 2018-07-29 16:49:32 · 87 阅读 · 0 评论 -
变量的生命周期
生命周期指在程序执行过程中变量存在的时间段。Go语言中编译器可以选择使用堆或栈上的空间来分配,而不是基于var或new。Go语言有逃逸识别的机制,但每一次变量逃逸都需要额外的内存分配过程。 例如x逃逸:var global *intfunc f() { var x int global = &x}...原创 2018-07-29 16:46:29 · 234 阅读 · 0 评论 -
赋值
多重赋值。交换俩个变量的值时很方便,例如:x, y = y, x可赋值性。赋值语句是显式的赋值,但程序中很多地方是隐式赋值,例如函数中的参数,函数中的return。复合类型的字面量表达式:me := []string{"a", "b", "c"}...原创 2018-07-29 16:44:14 · 169 阅读 · 0 评论 -
名称
命名规则:Go中函数、变量、常量、类型、语句标签和包的名称都遵循一个规则,开头是一个字母或下划线,后面跟任意字符、数字和下划线,并区分大小写。 例如:heapSort和HeapSort是不同名称。命名风格:Go更喜欢“驼峰式”风格——更喜欢用大写字母而不是下划线。例如:QuoteRuneToASCII、parseRequestLine。 像ASCII和HTML这样的首字母缩写词通常使用相同...原创 2018-07-29 16:42:03 · 107 阅读 · 0 评论 -
类型声明
type声明定义一个新的命名类型,提供一种方式区分相同底层类型,这样不会混用。 例如:type w float64type m float64w和m不是相同类型,即使底层都是float64。他们不能使用算术表达式比较和合并。...原创 2018-07-29 16:27:30 · 894 阅读 · 0 评论 -
声明
声明给一个程序实体命名,并且设定其部分或全部属性。 有4个主要的声明:变量、常量、类型和函数。一个GO程序文件: 以package声明开头,表明文件属于哪个包 然后是import声明 然后是包级别的类型、变量、常量、函数的声明,不区分顺序...原创 2018-07-29 16:20:29 · 63 阅读 · 0 评论