订阅博客
收藏博客
微博分享
QQ空间分享

go 语言学习第二天笔记

频道:go语言 标签: 时间:2019年08月28日 浏览:29次 评论:0条
作者: 三只松果

Day 02


for循环


For里面的三条语句都可以省略


也可以写成这种形式


for n, i := 1, 10; n < 5 && i > 5; n, i = n+1, i-1 {

        fmt.Println(n, i)

    }



switch的两种用法


score := 90

    var grade string

    switch {

    case score == 90:

        grade = "A"

    case score == 80:

        grade = "B"

    default:

        grade = "C"

    }

    fmt.Println(grade)


    var grade1 string

    switch grade {

    case "A":

        grade1 = "优秀"

    case "B":

        grade1 = "良好"

    default:

        grade1 = "不及格"

    }

    fmt.Println(grade1)



Fallthrough执行后直接执行下一个条件里的内容,不需要判断


switch num := 70; {

    case num < 80:

        fmt.Println("小于50")

        fallthrough

    case num < 10:

        fmt.Println("小于10")

        fallthrough

    default:

        fmt.Println("default")

    }



函数的三种典型用法


func CalculateArea(width float32, height float32) float32 {

    return width * height

}


func CalculateAll(width, height float64) (float64, float64) {

    return (width + height) * 2, width * height

}


func CalculateThree(width, height float64) (area float64, rec float64) {

    area = width * height

    rec = (width + height) * 2

    return

}


函数的引用传递,将地址传入函数,参数在函数里修改以后外面的参数也会随之改变

swap(&a, &b)

func swap(x, y *int) {

    var temp int

    temp = *x

    *x = *y

    *y = temp

}


数组(值类型)


arr1 := [5]int{1, 2, 3, 4, 5}

arr2 := [...]int{1, 2, 3, 4, 1, 3, 2}

[]可以根据后面给的内容自己识别长度

数组长度不同时不能相互赋值:a[10]=b[5]这种是不允许的


For range用法

for x, y := range arr {

        fmt.Println(x, y)

    }


for _, v := range arr {

       fmt.Println(v)

   }


二维数组遍历

var  arr  [3][2]string

for _, v := range arr {

        for _, v1 := range v {

            fmt.Println(v1)

        }

    }



切片slice


声明

var slice1 []int = make([]int, 6)

slice2 := make([]int, 6)

Slice3 :=[]int{1,2,3}

Make中第一个参数为类型,第二个为长度


如果直接从现有数组引用则无需开辟空间

arr := [5]int{1, 2, 3, 4, 5}

sl := arr[1:3]


注:数组中arr[a,b]表示取下标从ab-1这一段数组


切片的字节数为24字节:8字节的地址指针,8字节的len长度,8字节的cap容量(len表示已经放了多少个,cap表示最大容量)



当给一个切片追加新元素时,切片的容量cap会扩充,扩充的方式为变为原来的两倍容量,长度只会比原来多一个

例:

    c := make([]int, 3, 3)

    fmt.Println("value:", c, "len:", len(c), "cap:", cap(c))

    c = append(c, 10)

    fmt.Println("value:", c, "len:", len(c), "cap:", cap(c))

输出:

value: [0 0 0] len: 3 cap: 3

value: [0 0 0 10] len: 4 cap: 6


切片的长度和容量:长度为切片当前包含的元素个数,容量为切片的起始元素开始到底层数组的最后一个元素的元素个数

例:

    arr := [...]string{"a", "b", "c", "d", "e", "f"}

    slice := arr[1:4]

    fmt.Println("len:", len(slice), "cap:", cap(slice))

输出:len: 3 cap: 5


copy的用法copy(目标,源)

例:func testCopy() []string {

    arr := [...]string{"aaa", "bbb", "ccc", "ddd"}

    needCopy := arr[2:4]

    copyStr := make([]string, 3)

    copy(copyStr, needCopy)

    return copyStr

}

Copy解决了一个大数组一直被切片引用导致不能释放内存导致资源浪费的问题


切片元素删除

s = append(s[:i], s[i+1:])


切片案例

    a := [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}

    a1 := a[:]

    a2 := a1

    a1 = append(a1[:1], a1[5:]...)

    fmt.Println(a2, cap(a2))

    fmt.Println(a1, cap(a1))

输出:

[1 6 7 8 9 6 7 8 9] 9

[1 6 7 8 9] 9


当切片追加时如果长度没有超过容量,则不会开辟新的空间,所以a1的修改导致了a被修改,从而间接的修改了a2


Map键值对(引用类型)

8个字节,它本质上是一个指针


三种声明方式

    var map1 map[string]string = make(map[string]string)

    map2 := make(map[string]string)

    map3 := map[string]string{

        "name": "zhangsan",

        "age":  "20",

    }


map[key]的返回值有两个,一个为value,一个为okOK值用来判断该键值是否存在,不存在时OKfalse

Value,ok:=map[key]


delete(map1,”zhangsan”):删除map1里面的zhangsan键值对


◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。