对golang的概括理解

61 阅读2分钟

Go是一种编译型语言,结合了解释型语言的优点(如调试效率,跨平台),动态类型语言的优点(如开发效率),以及静态类型的优点; Go是静态类型语言,类型系统没有层级; Go是垃圾回收型的语言,并为并发执行与通信提供了基本的支持; Go目标是要成为一种现在的系统语言 defer定义延迟调用,无论函数是否出错都确保结束前被调用 ok-idiom(A跌目)模式:多返回值中用一个名为ok的布尔值来标记操作是否成功 结构中的匿名字段,结构的实例可以直接调用匿名字段的方法和属性 计算机中变量是一段或者多段用来存储数据的内存,类型决定变量内存的长度和存储格式,所以我们只能修改变量值不能修改类型 内存分配发生在运行时,编译后的机器码不使用变量名而是直接使用内存地址访问目标数据,所以编码阶段采用易于阅读的变量名 惯例建议以组的方式整理多行变量定义 var {x,y int }  type{ xxx } 简短声明一般用于函数多返回值,以及if for switch等语句中定义局部变量 指针是实体会分配内存空间,内存地址是内存中每个字节单元的唯一编号 指针类型指向相同地址或nil则相等,但是不能做加减和类型转换 unsafe.Pointer将指针转换为uintptr进行加减运算,但可能造成非法访问 指针不能用->,统一使用. 复合类型初始化,必须包含类型标签;左花括号必须在类型尾部;多成员都好隔开;多行右侧必须是逗号或者花括号 switch 无需显式执行break,但是想顺序执行需要显式执行fallthrough range迭代是复制数据 管是指针、引用类型还是其天涯类型参数,都是值拷贝传递,区别在于拷贝的目标对象 指针传递坏处在于延长该变量的声明周期,也可能导致他分配到堆上增加性能消耗 函数参数在函数内部有效,作用域是整个函数内部 变参  func test(a ...int){}   test(a[:]...) 命名返回值的问题:  新定义的同名局部变量会引起同名遮蔽:xx is shadowed during return ;此时实名return即可 闭包 匿名函数能够使用上下文的环境中的数据(最终数据) 延迟调用defer 常用于资源释放 解除锁定 错误处理等 先入后出。 延迟调用开销很大,性能要求高压力大的算法尽量避免使用 error是接口类型