golang基础-防忘指北

    一    坑java

        1.    用自带的 json 库序列化 strut 变量时,只有那些首字母大写的变量才会被序列化,这意味着在go的世界里,全部的json属性名都是大写开头...这真的不是bug吗...(ps : 已经找到大写转小写的解决方案,没搞清楚就挖坑,捂脸...)linux

        2.    任何一个未被捕获的 panic 都有可能致使整个程序的崩溃,必定要defer, recover...json

        3.    err != nil 就是翔,interface{} 滥用是翔中翔...设计模式

        4.    基础属性间的转换 和 拼接 也是翔...api

        5.    用go时,先忘记java的 设计模式 和 一切皆对象        数组

        6.    在go里,变量的nil值须要特别关注,由于会被赋予0值。业务设计上须要避开 或者 利用这一点函数

        7.    window 和 linux 的syscall包的 api 不一致,须要特别关注,想编译个linux包时才知道什么叫痛ui

 

 

    二 指北spa

        1.    package <pkgName>这一行表示当前文件属于哪一个包,而包名main则告诉咱们它是一个可独立运行的包,它在编译后会产生可执行文件。除了main包以外,其它的包最后都会生成*.a文件(也就是包文件)并放置在$GOPATH/pkg/$GOOS_$GOARCH中。每个可独立运行的Go程序,一定包含一个package main,在这个main包中一定包含一个入口函数main,而这个函数既没有参数,也没有返回值。设计

        2.    点操做,导入包时,若是包名前有点号,则在调用这个包的函数时,能够省略前缀的包名。如fmt.println()能够写为println()。

        3.    别名操做,能够在导入的包前加入字符串指定别名;_操做,当导入的报名前包含该符号时,意为调用该包里的init函数,而不直接使用包里的函数。

        4.    rune是int32的别称,byte是uint8的别称,int8和int32这类位数不一样的变量之间不容许互相赋值或者操做。

        5.    浮点数的类型有float32和float64两种(没有float类型),默认是float64。

        6.    ` 括起的字符串为Raw字符串,即字符串在代码中的形式就是打印时的形式,它没有字符转义,换行也将原样输出。

        7.    除非被显式设置为其它值或iota,每一个const分组的第一个常量被默认设置为它的0值,第二及后续的常量被默认设置为它前面那个常量的值,若是前面那个常量的值是iota,则它也被设置为iota,iota的默认值为0,每调用一次都会加1,但每遇到一个const,iota就会重置

        8.    大写字母开头的变量是可导出的,也就是其它包能够读取的,是公用变量;小写字母开头的就是不可导出的,是私有变量。 大写字母开头的函数也是同样,至关于class中的带public关键词的公有函数;小写字母开头的就是有private关键词的私有函数。

        9.    Slice,go里面的动态数组,它是一个引用类型。声明一个slice和申明一个array同样,只是少了长度定义:var myslice []int

        10.    Slice能够从一个已经存在的数组或者slice中再次声明,经过array[i:j] 来获取,由于slice是引用类型,改变其值也会改变原数组的值。

        11.    Map有两个返回值,第一返回值为请求的key的value,第二个返回值为该key是否存在,是的话true,反之false;map也是引用类型,值的修改会影响全部一样引用该map的值

        12.    Make用于内建类型(map,slice 和channel)的内存分配,new用于各类类型的内存分配

        13.    For配合range能够用于读取slice和map中的内容。

        14.    Switch的每一个case后面默认带有break,能够经过fallthrough强制执行后面的代码,每个fallthrough只会生效一次。

        15.    在函数体中,变参是一个slice数组。

        16.    函数的参数传递是值传递,若是须要在函数体中调整参数本体信息,须要定义指针类型参数,并传入地址。

        17.    Defer语句会在函数体执行完后开始执行,执行顺序是后进先出,也就是逆序。

        18.    当函数做为一种变量时,能够经过type来进行定义,他的类型就是全部拥有相同的参数,相同的返回值的一种类型。

        19.    panic有点像java中的抛出异常,当函数调用了panic后,该协程的会执行函数体中的defer,而后一路向上返回,直到协程退出。

        20.    正常时调用recover会返回nil,没有任何其余效果,可是当协程陷入崩溃状态(相似panic),则recover会捕获到panic的值,而且让协程恢复正常执行,有点相似java中的catch。

        21.    Struct有 N 种初始化方式,一种按参数顺序提供值 p:=person(‘xxx’, 123);第二种时经过field:value的方式初始化,如:p:={name:’xx’,age:12}

        22.    当匿名字段是一个stuct时,该struct的所有字段都被隐式的导入当前的struct。

        23.    对象的方法须要以函数的形式进行绑定,默认是值传递,当以指针绑定时,是引用传递,相似: func (b *box) test() string{}

        24.    Go里,接口是方法的聚合,当某个对象实现了某个接口的全部方法时,则认为此对象实现了该接口,能够将对象的值赋给该接口类型,能够经过接口访问对象的方法,但不能访问对象的属性。

        25.    空接口作参数时,能够接受任何类型的参数,由于至关于任意类型都实现了该接口。

        26.    Value, ok = element.(T) 能够用于判断 element是不是T类型的数据,value是变量的值,element是interface类型的变量;element.(type)不能在switch外的地方使用。

        27.    能够经过close(c)方法来关闭一个channel;能够经过range来不断的读取channel中的数据,直到该channel被显示的关闭;能够经过select来监视channel的读写。

        28.    交换 i 和 j 变量的方式 : i, j = j, i 。

相关文章
相关标签/搜索