Golang note

一、 单点知识:

1. &取址,*取值

2. 包访问:“大小写控制”

     大写:可导出[要使某个符号对其他包可见,只需将该符号定义为以大写字母开头即可。这规则对于成员变量和成员函数是一致的。]

     小写:私有

3. var + import

           pkg.fuc

var name type = value

var (
    name1 type1 = value1
    name2 type2 = value2
    name3 type3 = value3
    ...
)

    import(

              "fmt"

               "os"

)

4. := “局部” 

   := 是声明变量并赋值

   :=只能在函数中使用,所以只能定义局部变量。

   :=定义的变量不能改变值(也就是b:="q",在函数中不能再重新这样定义 b:="s",但是可以b="s")

   b, f := "q", 1

   

    =  “全局”

    = 是赋值,var和=可以平行定义并赋值:

5.字符串两种表示: 

    “     ”           

    '       '

6. make 引用 (高效)   map sclice channel   

   new 值

7. Fuc 函数 可以赋值给变量:   var identifier = fuc()

    IF 接口  y,ok =x.(Type) 转换成 Type类型的IF;默认为 pointer类型;

8.case,switch:

  1、花括号{必须与for处于同一行。

  2、单个case后可以出现多个结果选项

  3、只有在case中明确添加fallthrough关键字,才会继续执行下一个case

-------------------------------------------------------------------------------

二、 非单点知识点:

1、func 函数名(args ...Type) (返回值列表) {
    // 函数体
}

        形如args ...Type的用法只能作为函数的参数类型,并且必须是最后一个参数

        形如args ...Type的用法是一个语法糖(syntactic sugar),即对语言功能没有影响,但可以增加程序的可读性。

        形如args ...Type的用法从内部实现上说,其本质上是一个数组切片,即[]type,因此可以用for循环来获得每个传入的参数。

 

2、流程控制语句类型

       ▪ 选择语句中,左花括号{必须与switch同处一行。

       ▪ 选择语句中,case后可以使用常量,还可以使用变量。

       ▪ 选择语句中,单个case后可以出现多个结果选项。

       ▪ 选择语句中,不需要用break来明确退出一个case

       ▪ 选择语句中,只有在case中明确添加fallthrough关键字,才会继续执行下一个case

 

       ▪ 选择语句中,可不设定switch后的条件表达式,在此种情况下整个switch结构与if...else...的逻辑等同。

 

 

 循环语句只支持for结构,不支持whiledo-while结构。

       ▪ 循环语句左花括号{必须与for处于同一行。

       ▪ 循环语句不支持以逗号为间隔的多赋值语句,支持使用多元赋值的方式来初始化多个变量。

       ▪ 循环语句支持continuebreak来控制循环,但提供了一个更高级的break,可以选择中断哪一层循环。

 

       ▪ 条件语句不需要使用括号()将条件包含起来。

       ▪ 条件语句无论语句体内有几条语句,花括号{}都必须存在。

       ▪ 条件语句的左花括号{必须与ifelse同处一行,否则编译器给出错误:syntax error: missing { after if clause。

       ▪ 条件语句的else必须和上一个语句体结束的右花括号}同处一行,否则编译器给出错误:syntax error: unexpected else, expecting }。

       ▪ 条件语句在if之后可以添加变量初始化语句,但需要使用分号;间隔。

if a := 1; a >= 1 {
    fmt.Println("OK")
}

       ▪ 条件语句:关键字为if、else和else if。

       ▪ 选择语句:关键字为switch、case和select。

       ▪ 循环语句:关键字为for和range。

       ▪ 跳转语句:关键字为goto

 

3、资源释放


       在c++程序中,经常要注意内存指针、文件句柄、网络套接字等等资源的释放,特别需要注意其释放的时机。而golang使用defer
关键字和背后的内部机制简单地解决了资源释放的问题。

        defer关键字能保证其后的代码能在函数退出前调用。

        一个函数中可以存在多个defer语句,需要注意的是defer语句的调用是遵照先进后出的原则,即最后一个defer语句将最先被执行

        可以在defer后加一个匿名函数来进行复杂的清理工作。

异常处理


       一些高级语言中一般提供类似try...catch...finally...的语法,用于捕获异常。golang提供panicrecover两个关键字用于异常处理。

• panic

       panic在golang中是一个内置函数,接收一个interface{}类型的值作为参数:

func panic(interface{}) {
    ...
}

       当一个函数执行过程中调用panic函数时,函数执行流程将立即终止,但panic之前的defer关键字延迟执行的语句将正常执行,之后该函数将返回到上层调用函数,并逐层向上执行panic流程,直至函数所属的goroutine中所有正在执行函数终止。错误信息将被报告,包括在调用panic()函数时传入的参数。

• recover

       recover在golang中是一个内置函数,返回一个interface{}类型的值作为参数:

func recover() interface{} {
    ...
}

       panic函数触发后不会立即返回,而是先defer,再返回。如果defer的时候,有办法将panic捕获到,然后及时进行异常处理,并阻止panic传递,那处理机制就完善了。因此golang提供了recover内置函数,用于捕获panic并阻止其向上传递。需要注意的是,recover之后,逻辑并不会恢复到panic处,函数还是会在defer之后返回,但是所属goroutine将不会退出。

4、• 值类型和引用类型

        引用类型一个特点:引用不绑定特定对象(c++中引用是要绑定特定对象),例如有两个同类型引用a和b,它们可以引用各自的对象A和B;但如果a和b的引用都指向A,那么通过b修改对象内容可以反应到a引用之中。

       √ golang从本质上说,一切皆是值类型,并没有内建一个类似java或c#等语言中的reference类型。 

        golang可以使用指针,可以在行为上达到类似java或c#等语言中reference的效果。

        golang中从行为表现上看,数组属于值类型数组切片、字典、通道和接口属于引用类型

▶  引用类型实现

        golang中通过指针能实现引用类型效果

        golang中通过指针或对象访问成员都是使用点操作符,因此指针看起来和对象一样,即类似引用

 

5、与数组切片和字典类似,通道和接口本质上说值类型,但从行为表现上看属于引用类型

6、

 

 

golang 类型:

基础+复合


        golang内建基础类型有布尔类型、整数类型、浮点类型、复数类型、字符串类型、字符类型和错误类型。

       

 

  golang支持的复合类型有指针、数组、数组切片、字典、通道、结构体和接口。

       

 

 

 

11. reflect.Value.Kind():返回的常量:

      const (
    Invalid Kind = iota
    Bool
    Int
    Int8
    Int16
    Int32
    Int64
    Uint
    Uint8
    Uint16
    Uint32
    Uint64
    Uintptr
    Float32
    Float64
    Complex64
    Complex128
    Array
    Chan
    Func
    Interface
    Map
    Ptr
    Slice
    String
    Struct
    UnsafePointer
)

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页