• go defer


    1     conn, err := websocket.Upgrade(w, req, w.Header(), bufSize, bufSize)
    2     if err != nil {
    3         code = errWSUpgradeFailed
    4         msg = err.Error()
    5         return
    6     }
    7     defer conn.Close()

    defer conn.Close() 要放在判err之后,因为err时conn为nil,然后nil.Close()会使程序出错,甚至直接panic崩调

        code := Success
        msg := ""
        var response responseJSON
        defer func() {
            writeResponse(msg, response, w, code)
        }()

    defer执行匿名函数

      1 package main
      2 import "fmt"
      3 func f1() (result int) {
      4     println("-------------------------------")
      5     defer func() {
      6         result++
      7     }()
      8     return 0
      9 }
     10 func f2() (r int) {
     11     println("-------------------------------")
     12      t := 5
     13      defer func() {
     14        t = t + 5
     15      }()
     16      return t
     17 }
     18 func f3() (r int) {
     19     println("-------------------------------")
     20     defer func(r int) {
     21           r = r + 5
     22     }(r)
     23     return 1
     24 }
     25 func f4() (r int) {
     26     println("-------------------------------")
     27     r=100
     28     return
     29 }
     30 func f5() (r1 int,r2 interface{},r3 string) {
     31     println("-------------------------------")
     32     return
     33 }
     34 func f6() (r1 int) {
     35     println("-------------------------------")
     36     defer func() {
     37         if r1==100 {
     38             println("r1==100")
     39         }
     40     }()
     41     r1=100
     42     return
     43 }
     44 func f7() (r1 int) {
     45     println("-------------------------------")
     46     r1=100
     47     return 1
     48 }
     49 func f8() (r1 int) {
     50     println("-------------------------------")
     51     r1=100
     52     defer func() {
     53         r1++;
     54     }()
     55     return 1
     56 }
     57 func f9() (r1 int) {
     58     println("-------------------------------")
     59     defer func(r int) {
     60         r++
     61     }(r1)
     62     return
     63 }
     64 func f10() (r interface{}) {
     65     println("-------------------------------")
     66     r=1
     67     defer func(a interface{}) {
     68         fmt.Println("a:",a)
     69         fmt.Println("r:",r)
     70         a=100
     71         fmt.Println("a:",a)
     72         fmt.Println("r:",r)
     73     }(r)
     74     return
     75 }
     76 func f11() (r interface{}) {
     77     println("-------------------------------")
     78     r=1
     79     defer func(a interface{}) {
     80         fmt.Println("a:",a)
     81         fmt.Println("r:",r)
     82         a=100
     83         fmt.Println("a:",a)
     84         fmt.Println("r:",r)
     85     }(r)
     86     r=2
     87     defer func(a interface{}) {
     88         fmt.Println("second a:",a)
     89         fmt.Println("second r:",r)
     90         a=200
     91         fmt.Println("second a:",a)
     92         fmt.Println("second r:",r)
     93     }(r)
     94     return
     95 }
     96 func f12() (r interface{}) {
     97     println("-------------------------------")
     98     r=1
     99     defer func(a interface{}) {
    100         fmt.Println("a:",a)
    101         fmt.Println("r:",r)
    102         a=100
    103         fmt.Println("a:",a)
    104         fmt.Println("r:",r)
    105     }(r)
    106     r=2
    107     defer func(a interface{}) {
    108         fmt.Println("second a:",a)
    109         fmt.Println("second r:",r)
    110         a=200
    111         fmt.Println("second a:",a)
    112         fmt.Println("second r:",r)
    113     }(r)
    114     r=3
    115     return
    116 }
    117 func f13() (a interface{},b interface{}) {
    118     println("-------------------------------")
    119     return 1,2
    120 }
    121 func f14() map[string]string{
    122     println("-------------------------------")
    123     a:=map[string]string{"a":"b"}
    124     defer func(mp map[string]string) {
    125         mp["a"]="c"
    126     }(a)
    127     return a
    128 }
    129 func f15() string{
    130     println("-------------------------------")
    131     a:="a"
    132     defer func(mp string) {
    133         mp="b"
    134     }(a)
    135     return a
    136 }
    137 func f16() []byte{
    138     println("-------------------------------")
    139     a:=[]byte("a")
    140     defer func(mp []byte) {
    141         mp=[]byte("b")
    142     }(a)
    143     return a
    144 }
    145 func f17() chan int{
    146     println("-------------------------------")
    147     a:=make(chan int,10)
    148     defer func(mp chan int) {
    149         mp<-1
    150     }(a)
    151     return a
    152 }
    153 func main() {
    154     println(f1())
    155     println(f2())
    156     println(f3())
    157     println(f4())
    158     a,b,c:=f5()
    159     fmt.Println(a,b,c)
    160     println(f6())
    161     println(f7())
    162     println(f8())
    163     println(f9())
    164     fmt.Println(f10())
    165     fmt.Println(f11())
    166     fmt.Println(f12())
    167     e,f:=f13()
    168     fmt.Println(e,f)
    169     fmt.Println(f14())
    170     fmt.Println(f15())
    171     fmt.Println(string(f16()))
    172     fmt.Println(len(f17()))
    173 }
    测试
     1 -------------------------------
     2 1
     3 -------------------------------
     4 5
     5 -------------------------------
     6 1
     7 -------------------------------
     8 100
     9 -------------------------------
    10 0 <nil> 
    11 -------------------------------
    12 r1==100
    13 100
    14 -------------------------------
    15 1
    16 -------------------------------
    17 2
    18 -------------------------------
    19 0
    20 -------------------------------
    21 a: 1
    22 r: 1
    23 a: 100
    24 r: 1
    25 1
    26 -------------------------------
    27 second a: 2
    28 second r: 2
    29 second a: 200
    30 second r: 2
    31 a: 1
    32 r: 2
    33 a: 100
    34 r: 2
    35 2
    36 -------------------------------
    37 second a: 2
    38 second r: 3
    39 second a: 200
    40 second r: 3
    41 a: 1
    42 r: 3
    43 a: 100
    44 r: 3
    45 3
    46 -------------------------------
    47 1 2
    48 -------------------------------
    49 map[a:c]
    50 -------------------------------
    51 a
    52 -------------------------------
    53 a
    54 -------------------------------
    55 1
    结果

    defer会从下往上执行,若return时没到达的defer不执行,

    非匿名函数

    func(a interface{},b interface{}) (c interface{},d interfacd{}) {

    c=3

    d=4

    return

    return 1,2

    }

    c和d在进入函数时定义,一旦return,c和d的值都会返回,如果return 1,2,则1,2的值会赋给c,d,return时要么都不赋值,要么都赋值,不能只赋部分

    对于匿名函数func(a interface{}) {

     a=1

    }(r)

    表示将r传入函数作为a的值,除了chan和map,别的一定是复制传入(interface{},[]byte,etc),不会传入指针,而且a的值是运行函数时r的值

  • 相关阅读:
    web 小知识
    有关Windows上启动java -jar的脚本
    常用工具类
    解决Failed to start connector [Connector[HTTP/1.1-xxxx]]
    破解一号店的心得
    eclipse中有关版本控制工具的使用
    Bilibili_解析ProtoBuf格式的弹幕
    学校平台的模拟登录和相关操作
    雨课堂模拟登录_获取websocket数据
    学堂在线视频字幕抓取2_油猴脚本编写
  • 原文地址:https://www.cnblogs.com/cdyboke/p/6669262.html
Copyright © 2020-2023  润新知