• Go语言设计模式(五)


    Generator Pattern 生成器模式

    Generators yields a sequence of values one at a time. 生成器一次生成一个值序列。
    package main
    
    import "fmt"
    
    func Count(start int, end int) chan int {
    	ch := make(chan int)
    	go func(ch chan int) {
    		for i := start; i <= end; i++{
    			ch <- i
    		}
    		close(ch)  // 需要关闭channel,否则监听这个生成器的协程无法关闭
    	}(ch)
    	return ch
    }
    
    func main() {
    	for i := range Count(1,99) {
    		fmt.Println("Pass it around, put one up,",i,"bottles of beer on the wall")
    	}
    
    	fmt.Println(100,"bottles of beer on the")
    }
    

      

    Parallelism Pattern 并行模式

    Parallelism allows multiple "jobs" or tasks to be run concurrently and asynchronously. 并行性允许多个“作业”或任务并发和异步运行
    An example showing implementation and usage can be found in parallelism.go.  一个显示实现和使用的例子可以在parallel .go中找到。
     
    Fan-In Messaging Patterns
    Fan-In is a messaging pattern used to create a funnel for work amongst workers (clients: source, server: destination).  We can model fan-in using the Go channels.  扇入是一种消息传递模式,用于在工作者(客户端:源,服务器:目标)之间创建工作漏斗。我们可以使用Go通道来模拟扇入。
    package main
    
    import (
    	"fmt"
    	"sync"
    )
    
    func Merge(cs ...<-chan int) <-chan int {
    	var wg sync.WaitGroup
    
    	out := make(chan int)
    
    	send := func(c <-chan int) {
    		for n := range c {
    			out <- n
    		}
    		wg.Done()
    	}
    	wg.Add(len(cs))
    
    	for _, c := range cs {
    		go send(c)
    	}
    
    
    	go func() {
    		wg.Wait()
    		close(out)
    	}()
    	return out
    }
    
    func main() {
    	c := make(chan int, 2)
    	d := make(chan int, 2)
    	c <- 4
    	c <- 5
    	d <- 6
    	d <- 7
    
    	m := Merge(c, d)
    	for i := range m {
    		fmt.Println(i)
    	}
    }
    

      

     
    装饰器模式
    package main
    
    import (
    	"fmt"
    	"log"
    	"net/http"
    )
    
    func isAuthorized(endpoint func(http.ResponseWriter, *http.Request)) http.Handler {
    	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    
    		fmt.Println("Checking to see if Authorized header set...")
    
    		if val, ok := r.Header["Authorized"]; ok {
    			fmt.Println(val)
    			if val[0] == "true" {
    				fmt.Println("Header is set! We can serve content!")
    				endpoint(w, r)
    			}
    		} else {
    			fmt.Println("Not Authorized!!")
    			fmt.Fprintf(w, "Not Authorized!!")
    		}
    	})
    }
    
    func homePage(w http.ResponseWriter, r *http.Request) {
    	fmt.Println("Endpoint Hit: homePage")
    	fmt.Fprintf(w, "Welcome to the HomePage!")
    }
    
    func handleRequests() {
    
    	http.Handle("/", isAuthorized(homePage))
    	log.Fatal(http.ListenAndServe(":8081", nil))
    }
    
    func main() {
    	handleRequests()
    }
    

      

     
  • 相关阅读:
    Leetcode 58. 最后一个单词的长度 双指针
    Leetcode 125. 验证回文串 双指针
    拜托,大厂做项目可不简单!
    被问懵了:一个进程最多可以创建多少个线程?
    面对祖传屎山代码应该采用的5个正确姿势
    VUE代码格式化配置vetur、eslint、prettier的故事
    如何快速实现一个虚拟 DOM 系统
    NodeJS 进程是如何退出的
    [堆][启发式合并]luogu P3261 [JLOI2015]城池攻占
    [Trie][堆]luogu P5283 [十二省联考2019]异或粽子
  • 原文地址:https://www.cnblogs.com/double-W/p/12813815.html
Copyright © 2020-2023  润新知