golang学习笔记(一)

2019年12月24日 0 作者 y1nhui

前言

学golang,写笔记。这种东西一般情况下排版和不存在是没区别的。

内容

基础

defer

defer 语句会延迟函数的执行直到上层函数返回。
defer的效果是将后续语句押后
比如

package main

import "fmt"

func main() {
    defer fmt.Print("World")
    fmt.Print("Hello ")
}

输出:
QaVB9J.png
而defer是以栈的形式存储的,defer后的语句被压入栈内,以后入先出的形式而实现。用以下代码可以很直观的看到

package main

import "fmt"

func main() {
    for i := 1;i<10;i++{
        defer fmt.Print(i)
    }
}

输出:
Qa8tDe.png

指针

golang的指针定义有两种方式
var p *int
或者
p := &i
个人喜欢第二种,简单快捷。
同时go中没有指针运算,所以p++这种操作go是做不到的。

结构体

type xxx struct {
 a int
 b int
}

这样。
然后赋值的话

var {
 a = xxx{1,2}// a=1 b=2
 a = xxx{}// 空值
 a = xxx{a:1}// a=1 b空值
 p = &xxx{1,2}//一个指针,同时指向一个新的xxx,其中a=1 b=2
 }
 a := xxx{}

需要注意的是,golang中,如果是fmt.println(p),它并不是输出地址,而是&{1,2}

数组与slice

slice和数组是分不开的,所以就放一起了。
数组的定义挺简单的: var name [num]type
slice可以用来访问数组部分或全部数据。
比如定义数组 var a [10]int
那么我们就可以 s := a[2:5]来生成一个切片,其内分别是a[2]、a[2]、a[4]
slice有三个属性,指针,长度和容量。长度是slice内的元素个数不可大于容量。容量的大小是从指向的数组第一个的元素到该数组最后一个元素的长度。

个人理解,slice可以视为一个指向数组内容的指针数组,如果对slice内容修改,数组内容也会被修改。同时,如果使用append对slice添加,添加会直接加到slice末尾,同时会覆盖掉原数组内的下一个元素。
如:

func main() {
     a :=[5]string{1:"ONE",2:"two",3:"333",4:"Four"}
     b :=a[1:3]
     b= append(b,"Three")

     for i:=1;i<4;i++{
        fmt.Println(b[i-1])

     }
     for i:=1;i<5;i++{
         fmt.Println("a is",a[i])
     }
}

运行结果:
lCPpSU.png

map

这个是golang的复合数据类型中最让我迷惑的东西了。
了。设计精妙,用途广泛的数据结构之一。但是目前我不知道该怎么用(:з」∠)
map写法与前两种类似,不过需要用make来生成 a := make(map[k]v)k是键的数据类型,v指的数据类型。需要注意的是,键的类型必须是可以用==来比较的类型。

资料:
http://tour.studygolang.com/
《Go程序设计语言》