golang基础语法快速回顾

    技术2022-07-10  138

    最近准备深入学习下golang,所以花几分钟做一个快速回顾手册。

    基础

    变量声明

    var age, sex int //可一次声明多个 var age = 10 //可自动声明 var sex int //没有初始化,为零值 //省略var age := 10 //短声明,左边必须要是新的变量,不然用赋值 = ,只能被用在函数内部

    值类型和引用类型

    值类型,赋值是值进行拷贝,修改不会影响其他。引用类型,是存储地址进行拷贝,一个修改后,会改变原始值。

    常量

    const

    const LENGTH int = 10 //1. const ( //2.枚举 Female = 1 Male = 2 ) const( a = iota //0 b //1 c //2 d = "mirror" e //"mirror" )

    iota常量中的索引,在const关键字出现时被初始化为0,const每新增加一行,增1.注意,新版本1.11的功能好像变了!中间出现断层后,后面的都是断层字段。

    运算符

    其他没啥好讲的,主要是&*,一个取地址符,一个指针。

    函数

    func toString(user User) string { //参数,前面是参数,后面是类型, string是返回类型 //todo }

    函数参数

    值传递引用传递

    数组

    var arr = [5]int{1,2,3,4,5} //明文固定大小 var arr = [...]int{1,2,3} //系统判断大小

    指针

    &取地址符。放到变量前面,就会返回变量的内存地址。

    什么是指针:指向一个值的内存地址。

    var pointer *int //一个int类型的指针

    如何使用指针:

    定义指针变量为指针变量赋值(有取地址符的变量)通过指针,访问值。 var address string = "黄土高坡" var addressPointer *string // step 1 addressPointer = &address // step 2 fmt.Println(addressPointer) // step 3

    空指针:没有被分配任何变量,值为nil.

    结构体

    类似于类,可以存放不同类型的多种属性。

    type User struct { //定义 name string age int } john := User {"John", 24} //声明 fmt.Println(john.name, john.age) //访问结构体成员 //定义结构体指针,使用方式看指针 var ptr *User //通过指针传递参数,好处多多,节省内存空间,只需注意内部改动会影响外部。 toString(user *User) string {}

    切片

    动态数组,由于数组长度不可变等问题,切片强化了数组的功能。

    var slice1 []int //定义未指定大小的切片 var slice2 []int = make([]int, 10) //通过make创建 slice3 := make([]int, 10) //简写

    初始化

    slice1 := []int {1,2,3} //直接初始化 slice2 := arr[:] //引用了数组arr,冒号前后可设置索引值,表示引用数组的哪一段,前闭后开 slice3 := slice1[:] //加上中括号,可以选择性赋值,不加就全部赋值

    len()&cap()

    len()获取切片的长度,也就是包含的元素个数cap()获取切片的容量,从第一个元素开始,到其底层数组元素末尾的个数。

    cap()的概念有点不通俗,多看几个例子,体会一下。

    arr := [6]int{1,2,3,4,5,6} s1 := arr[:] //全盘收,所以len=6,cap=6 s2 := s1[:0] //长度明显为len=0,容量为第一个元素,到底层数组arr末尾的个数cap=6 s3 := s2[:4] //长度为len=4,容量为第一个元素,到底层素组arr末尾的个数cap=6【这个区间值得玩味,明明s2的长度为0】 s4 := s3[2:] //长度为s3的[:4]加上现在的左区间[2:]变成了[2:4]所以,len=2,容量2到6,cap=4

    append()©()

    增加切片容量的方式。

    copy()拷贝切片append()向切片追加新元素

    Range

    循环用。用于迭代数组、切片、通道、集合等。

    for k, v := range arr {} //也可丢弃k,v中的某项 for _, v := range arr {}

    集合-Map

    无序键值对。

    var _map map[int]string //普通声明 _map := make(map[int]string) //make声明

    delete()

    根据key删除元素

    delete(_map, 1)

    类型转换

    string(num)

    接口

    只要实现了接口中的方法,就是实现了这个接口。那个鸭子定理什么的,主要看起来像,就是了。

    /*定义接口*/ type User interface { run() } /*通过结构体去实现*/ type WhitePeople struct {} func (whitePeople WhitePeople) run() {} //隶属于whitePeople结构体的方法run(),说明实现了User接口。

    错误处理

    提供内部错误接口,结构体实现Error()方法后,就表示拥有了error接口的能力

    type error interface { Error() string }

    并发

    go&goroutine&channel

    go是关键字,用来开启goroutinegoroutine是轻量级线程channel通道,用于在goroutine中传递数据

    并发的是某个函数,所以:

    go toString() //通过go关键字调用某个函数 ch := make(chan int) //声明通道 ch <- v //把数据v传入ch,注意v的类型 v := <-ch //从ch接收数据并复制给v ch := make(chan int, 2) //第二个参数设置缓冲区,不然等待接收方的时候可能会导致阻塞
    Processed: 0.011, SQL: 10