golang基础-new_make、recover_panic、append、闭包

append

append:用来追加元素到数组、slice中

package main

import("fmt"
    // "errors"
)


func main() {
    //new函数
    j:= new(int)
    fmt.Println(j)
    *j = 100
    fmt.Println(*j)

    //append函数
    var b []int 
    b = append(b,10,30)
    fmt.Println(b)
    b = append(b,b...)
    fmt.Println(b)
}

输出如下:

0xc04203a1c0
100
[10 30]
[10 30 10 30]

recover处理异常

package main

import("fmt"
    "errors"
)


func main() {
    //recover捕获错误
    defer func(){
        err:= recover()
        if err!=nil{
            fmt.Println(err)
        }
    }()

    a:=0
    b:=100/a
    fmt.Println(b)
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
runtime error: integer divide by zero
PS E:\golang\go_pro\src\safly>

panic:用来做错误处理

package main

import(
    // "fmt"
    "errors"
)


func main() {
    //panic:用来做错误处理
    err:= initError()
    if err != nil{
        panic(err)
    }
}

func initError()error{
    return errors.New("init error")
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
panic: init error

goroutine 1 [running]:
main.main()
        E:/golang/go_pro/src/safly/demo.go:14 +0x8b
exit status 2
PS E:\golang\go_pro\src\safly>

new_make

new:用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针
make:用来分配内存,主要用来分配引用类型,比如chan、map、slice

package main

import(
    "fmt"

)


func main() {
    //返回一个slice
    s2 := make([]int,10)
    fmt.Println(s2)
    s2[0] = 10
    fmt.Println(s2)

    //返回一个地址
    s1 :=new([]int)
    fmt.Println(s1)

    *s1 = make([]int,5)
    (*s1)[0] = 10

    fmt.Println(s1)
    fmt.Println(*s1)
}

输出如下:

PS E:\golang\go_pro\src\safly> go run demo.go
[0 0 0 0 0 0 0 0 0 0]
[10 0 0 0 0 0 0 0 0 0]
&[]
&[10 0 0 0 0]
[10 0 0 0 0]
PS E:\golang\go_pro\src\safly>

闭包

闭包:一个函数和与其相关的引用环境组合而成的实体

package main

import(
    "fmt"

)


func main() {
    //闭包函数
    method := closure()
    fmt.Println(method(1,3))
    //匿名函数1
    sum:= func(a int,b int) int {
        return a + b
    }(2,3)
    fmt.Println(sum)
    //匿名函数2
    sum1:= func(a,b int)(sum int){
        sum = a+ b
        return 
    }

    fmt.Println(sum1(1,3))
    fmt.Println(returnMethod1(2,4))
    fmt.Println(returnMethod2(2,4))
}

//利用方法返回匿名函数
func returnMethod1(a,b int)int{
    return func(int,int)int{
        return a + b
    }(a,b)
}
//利用方法返回匿名函数运算结果
func returnMethod2(a,b int)int{
    resutlTemp:= func(int,int)int {
        return a+b
    }
    return resutlTemp(a,b)
}

//无参数闭包
func closure( ) func(int,int ) int {
    return func(a int,b int )int {
        return a + b
    }
}

输出如下:

4
5
4
6
6

相关文章

程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息...
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简...
简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其...
接下来学习并发编程, 并发编程是go语言最有特色的地方, go对并发编程是原生支持. goroutine是go中最近本...
先普及一下, 什么是广度优先搜索 广度优先搜索类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶...
第一天: 接口的定义和实现 第二天: 一. go语言是面向接口编程. 在学习继承的时候说过, go语言只有封装,...