首页 > 其他分享 >go 闭包和装饰器

go 闭包和装饰器

时间:2022-09-04 22:25:49浏览次数:77  
标签:闭包 name fmt Println func go foo 装饰

闭包

go 中实现闭包需要依赖 匿名函数

package main

import (
    "fmt"
)


func foo(name string) func() {
    return func() {
        fmt.Println("hello", name)
    }
}

func main() {
    f := foo("siri") // 执行这段代码, 拿到的是一个函数名
    f()  // 调用闭合范围内函数
}

装饰器模式

go 支持装饰器模式,实现上同其他语言略有不同

package main

import (
    "fmt"
)

type Decore func(string) func()

func foo(name string) func() {   // 这里 实现了 闭包 + 装饰器模式。闭包不是必须的
    fmt.Println("hello", name)
    return func() {
        fmt.Println("hello", name)
    }
}

func changeFoo(d Decore) Decore {
    return func(name string) func() {
        fmt.Println("change after")
        res := d(name)
        fmt.Println("change before")
        return res
    }
}

func main() {

    foo("seine")

    var foo Decore = changeFoo(foo) // 执行这段代码, 拿到的是一个函数名. 由于Go没有Python中那样的语法糖,因此只能手动重新赋值给同名的变量
    foo("siri")           // 这里并没有改变原来的函数和其调用方式
}

hello seine

change after 
hello siri   
change before

标签:闭包,name,fmt,Println,func,go,foo,装饰
From: https://www.cnblogs.com/notes201432273/p/16656308.html

相关文章

  • 【2022.9.2】Django框架(网页伪静态、视图层、模板层)
    学习内容概要网页伪静态视图层三板斧JsonResponseform表单上传文件FBV与CBV(核心)CBV源代码(面向对象)模板层模板语法传值模板语法之过滤器模板语法之标签......
  • #include<algorithm>函数
    1、查找函数(n.find("="))从前往后找:n.find();#include<bits/stdc++.h>#include<algorithm>usingnamespacestd;stringn;intmain(){ cin>>n; intlen=n.find('=......
  • [Go] Functions
    Functioncanreturnmultivalues:funcprintAge(ageint)(int,int){ return12,age}funcmain(){ age1,age2:=printAge(8) fmt.Println(age1) fmt.Print......
  • Django 环境安装
    Django是基于Python的Web框架,依赖Python环境,所以需要提前安装好Python解释器。关于Python的安装,请参考https://www.liujiangblog.com站点中Python教程的相关部分,这里不再......
  • 1530 bingo 不是题解
    *2600的死活卡住出不来,想啊,很想啊(指remake21*21的方阵,每个位置有一个概率是1,求凑出来bingo的概率这种题目先考虑容斥,那就是1-凑不出bingo的概率。直接做是2^44的,我做牛......
  • web框架-django框架
    目录web框架编写web框架模块动静态网页jinjia2模块python主流web框架django框架版本下载安装操作目录结构三板斧静态文件操作form表单request对象方法MySQL数据库连接ORM数......
  • django框架-4
    目录网页伪静态视图层模板层网页伪静态将动态网页伪装成静态网页从而提升网页被搜索引擎收录的概率(掏点票票更快更能提高搜索频率)表现形式就是网址乍一看像一个具......
  • django4/网页伪静态/视图层/模板层
    网页伪静态动态页动态网页,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。静态页即静态网页,是实际存在的,无需经过服务器......
  • 【2022-09-02】Django框架(四)
    Django框架(四)Django框架之伪静态概念静态文件:数据是写死,永远不会修改伪静态:将一个动态页面伪装成静态页面#为什么要伪装?伪装的目的在于增大本网站的seo查询力......
  • [Go] using For loop as While loop
    ThereisnoWhileloopinGo,butyoucanuseForloopaswhileloop:i:=1fori<100{fmt.Println(i)i+=1} funcmain(){ varmyTxt="This......