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

go语言学习笔记第三天

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

Day 03


指针(8个字节)

默认为nil


注:go语言中不能做指针运算,如p++

var  p *int



指针数组和数组指针


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

    p := &arr

    x := 10

    y := 20

    parr := [2]*int{&x, &y}


变参函数


函数:find(num int, slice ...int){}

调用:find(10, 0, 1)

调用时可以传任意个数的参数,在函数里第二个参数开始就用切片接收


匿名函数


例:

f := func() {

        fmt.Println("hello func")

    }

    f()

    a:=f

    a()

    fmt.Printf("%T \n", f)

    f1 := func(x, y int) int {

        return x + y

    }

    fmt.Println(f1(1, 2))

    fmt.Printf("%T \n", f1)


可以把函数赋值给一个参数,参数加括号调用,且该变量也可以再复制给其他的变量

匿名函数也可以传参和返回值,和普通函数用法不同点在于,他没有名字且可以在函数里面使用


函数作为返回值的用法:

func simpleF() func(a, b int) int {

    return func(a, b int) int {

        return a + b

    }

}

在主函数里面调用:f := simpleF()  fmt.Println(f(1, 2))



    func() {

        fmt.Println("func")

    }()


   f2:= func(a int) int {

        return a

    }(12)

在匿名函数后面加括号表示调用,有参数时一定要传参。f2得到的值为函数的返回值


用户自定义函数


例:

type add func(a, b int) int

func main() {

    var a add = func(a, b int) int {

        return a + b

    }

    fmt.Println(a(1, 2))

}


作为参数传递时:func simple(a add) {

    fmt.Println(a(1, 2))

}


闭包


函数:

func test() func() int {

    t := 1

    return func() int {

        t++

        return t

    }

}

调用:

    f := test()

    fmt.Println(f())//2

    fmt.Println(f())//3


    f1 := test()

    fmt.Println(f1())//2

    fmt.Println(f1())//3

输出:2 3 2 3

闭包返回的每一个函数里面的值都有一个单独的备份,称为外围变量


递归


实例

阶乘:

func factorial(n float64) float64 {

    if n > 0 {

        return n * factorial(n-1)

    }

    return 1

}


斐波那契数列:

func fibonacci(n int) int {

    if n < 2 {

        return n

    }

    return fibonacci(n-2) + fibonacci(n-1)

}

斐波那契数列输出时用循环


字符串


字符串中带汉字的话用for循环挨个输出会出现乱码问题,因为汉字占三个字节而字符串下标是按字节排

func printChars(s string) {

    for i := 0; i < len(s); i++ {

        fmt.Printf("%c ", s[i])

    }

}

所以如果牵扯到汉字,要先转化为rune类型

func printRunes(s string) {

    runes := []rune(s)

    for i := 0; i < len(runes); i++ {

        fmt.Printf("%c", runes[i])

    }

}

注:直接用for range遍历字符串可以自动区分汉字和字母(也可以用来计算字符串中rune数量)

utf8.RuneCountInString(s)方法可以用来计算当前字符串含有的rune数量


字符串不可变,s[0]=A’这种是不允许的

如果要修改,需要转化为rune切片

func change(s string) string {

    runes := []rune(s)

    runes[1] = ''

    return string(runes)

}



文章评论

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