go

Go编程模式:委托和反转控制

混江龙づ霸主 提交于 2021-02-13 18:38:16
反转控制 IoC – Inversion of Control 是一种软件设计的方法,其主要的思想是把控制逻辑与业务逻辑分享,不要在业务逻辑里写控制逻辑,这样会让控制逻辑依赖于业务逻辑,而是反过来,让业务逻辑依赖控制逻辑。在《 IoC/DIP其实是一种管理思想 》中的那个开关和电灯的示例一样,开关是控制逻辑,电器是业务逻辑,不要在电器中实现开关,而是把开关抽象成一种协议,让电器都依赖之。这样的编程方式可以有效的降低程序复杂度,并提升代码重用。 本文是全系列中第4 / 9篇: Go编程模式 Go编程模式:切片,接口,时间和性能 Go 编程模式:错误处理 Go 编程模式:Functional Options Go编程模式:委托和反转控制 Go编程模式:Map-Reduce Go 编程模式:Go Generation Go编程模式:修饰器 Go编程模式:Pipeline Go 编程模式:k8s Visitor 模式 « 上一篇文章 下一篇文章 » 面向对象的设计模式这里不提了,我们来看看Go语言使用Embed结构的一个示例。 目录 嵌入和委托 结构体嵌入 方法重写 嵌入结构多态 反转控制 实现Undo功能 反转依赖 嵌入和委托 结构体嵌入 在Go语言中,我们可以很方便的把一个结构体给嵌到另一个结构体中。如下所示: type Widget struct { X, Y int } type

How to explain golang slice range's phenomenon [duplicate]

我们两清 提交于 2021-02-13 17:41:23
问题 This question already has answers here : Golang Reusing Memory Address Copying from slice? (2 answers) Closed 3 years ago . type student struct { Name string Age int } func main() { m := make(map[string]*student) s := []student{ {Name: "Allen", Age: 24}, {Name: "Tom", Age: 23}, } for _, stu := range s { m[stu.Name] = &stu } fmt.Println(m) for key, value := range m { fmt.Println(key, value) } } result: map[Allen:0xc42006a0c0 Tom:0xc42006a0c0] Allen &{Tom 23} Tom &{Tom 23} How to explain Slice

How to explain golang slice range's phenomenon [duplicate]

夙愿已清 提交于 2021-02-13 17:40:17
问题 This question already has answers here : Golang Reusing Memory Address Copying from slice? (2 answers) Closed 3 years ago . type student struct { Name string Age int } func main() { m := make(map[string]*student) s := []student{ {Name: "Allen", Age: 24}, {Name: "Tom", Age: 23}, } for _, stu := range s { m[stu.Name] = &stu } fmt.Println(m) for key, value := range m { fmt.Println(key, value) } } result: map[Allen:0xc42006a0c0 Tom:0xc42006a0c0] Allen &{Tom 23} Tom &{Tom 23} How to explain Slice

【译】索引进阶(一):SQL SERVER索引介绍

谁说我不能喝 提交于 2021-02-13 16:54:36
【译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正】 原文链接: http://www.sqlservercentral.com/articles/Stairway+Series/72284/ 对于数据库设计来说,索引是至关重要的,它告诉了那些大量使用数据库的开发者其所使用的数据库的设计意图。然而不幸的是,在实际开发过程中,索引常常是作为一个性能问题发生时候的解决方案被添加上的。这一些列关于索引的介绍可以让你与专业的数据库设计人员保持思想及设计上的一致。 第一节介绍SQL SERVER的索引,它是使SQL SERVER在最小的时间内查询或者修改所要请求的数据的一种数据库对象,它目的在于使用最小的系统资源达到最大的性能优化。除此之外,好的索引设计可以保证数据库达到最大的并发数,这样一个用户的 查询就几乎不会影响另一个用户的查询请求。最后,索引提供了保证数据一致性的有效方式。这个章节只是对于索引的简单介绍,包含了基本的概念和用法,对于其具体的实现细节后续章节会予以描述。 对于数据库开发者来说,对于索引的总体理解显得特别重要,其原因之一在于:当一个对于SQL SERVER的请求从客户端到达时,SQL SERVER仅仅有两种可能的方式来访问到所所请求的数据: # 它可以扫描数据库表的每一行数据,从第一行到最后一行,检查每一行来判断其是否满足所请求的查询条件。 # 或者

2019正睿CSP-S模拟赛十连测day7

大憨熊 提交于 2021-02-13 08:48:30
2019正睿CSP-S模拟赛十连测day7 今天上午刚考完初赛,全员90+,就只有我是80(有可能80-?),慌得一匹,洛谷讨论一面又有一堆人估分比我高,还问有没有救,我原地自闭。教练说一星期后才能出分数线,那我这一个星期看来都要在自闭中度过了。 今天这场比赛就是在自闭中度过的,感觉没能很好地集中精力做题,一直在想初赛(也许集中精力也不能打上去?),最后的分数是 100+50+0(期望10)=150(rank=25) T1感觉还是比较送的,乱搞之中出正解,玩了玩搞了搞终于在一个小时之后弄了出来,T2有一个一眼的递归式,写了个记忆化上去,T3一看根本连思路都没有,直接自爆了。 link to this contest A. dls的生日礼物 首先判掉无解的情况,就是存在三个区间互相有交 现在对于任意一个位置都最多只会被两个区间覆盖,每个联通块只能相间分布,两种情况,并且与其它联通块相独立,于是答案就是$2^{联通块个数}$ 1 #include<bits/stdc++.h> 2 #define FOR(i,a,b) for (register int i=(a);i<=(b);i++) 3 #define For(i,a,b) for (register int i=(a);i>=(b);i--) 4 #define mem(i,j) memset(i,j,sizeof(i)) 5

Docker三十分钟快速入门(上)

China☆狼群 提交于 2021-02-13 08:47:46
一、背景 ​   最近,Docker技术真是一片火热,它的出现也弥补了虚拟机资源消耗过高的问题,直接让虚拟化技术有了质的飞跃。那么本文我们来聊一聊Docker,和大家一起认识Docker,简单入门Docker. 二、虚拟化技术简介和发展 1. 阶段一:无虚拟化技术    众所周知,在虚拟化技术出现之前,我们依靠扩展物理机的方式来扩展我们的应用,这个阶段很痛苦,也有很多的缺点,比如: Capex费用昂贵 Go to Product速度极其慢 系统可移植行极低 资源利用率极低 2. 阶段二:基于Hypervisor的虚拟化技术 这个阶段,出现的虚拟化技术让很多人开心不已,随着时间的流逝,市面上也出现不少相关的实际应用的技术,如:VMware、KVM、AWS、Microsoft的Hyper-V等。    基于Hypervisor的虚拟化技术的优点: 资源利用率高 易于扩展、伸缩 Go to Product快速 成本降低 基于Hypervisor的虚拟化技术的缺点: OS内核资源被重复消耗资源 应用移植性较低 3. 阶段三:基于容器的虚拟化技术 由于Hypervisor的虚拟化技术不是很完美,对内核的资源重复消耗,那随着技术的发展就出现了基于容器的虚拟化技术,最热的就是Docker Container了。它底层使用CGroup和Namespace来实现多个容器之间共享内核资源

Go_ go mod 命令解决墙的问题

六月ゝ 毕业季﹏ 提交于 2021-02-13 07:33:53
简介 由于众所周知的原因,在下载一些库的时候会下载不了,比如 golang.org/x/... 相关的库。为此,网上出现了很多解决方案。 从 Go1.11 开始,Go 引入了 module,对包进行管理,通过 go mod 命令来进行相关操作。这里,我们基于 Go 目前最新版本 Go1.12,通过 module 来搭建 Goland 开发环境。 创建Project 打开 Goland,创建 project,左侧选择 Go Modules(vgo),在 Proxy 中输入: https://athens.azurefd.net (这是下载墙外包的关键),如果不行,试试输入 https://goproxy.io 编写测试代码 我们来试验通过 Colly 抓取数据 我们通过 Goland 创建一个 main.go 文件,粘贴上如下代码: package main import ( "fmt" "github.com/gocolly/colly" ) func main() { c := colly.NewCollector() // Find and visit all links c.OnHTML("a[href]", func(e *colly.HTMLElement) { e.Request.Visit(e.Attr("href")) }) c.OnRequest(func(r

Go语言基础之并发

痞子三分冷 提交于 2021-02-13 06:20:25
Go语言基础之并发 并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。 Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天)。 并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天)。 Go语言的并发通过 goroutine 实现。 goroutine 类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个 goroutine 并发工作。 goroutine 是由Go语言的运行时调度完成,而线程是由操作系统调度完成。 Go语言还提供 channel 在多个 goroutine 间进行通信。 goroutine 和 channel 是 Go 语言秉承的 CSP(Communicating Sequential Process)并发模式的重要实现基础。 goroutine 在java/c++中我们要实现并发编程的时候,我们通常需要自己维护一个线程池,并且需要自己去包装一个又一个的任务和然后自己去调度线程执行任务并维护上下文切换,这一切通常会耗费程序员大量的心智。能不能有一种机制,程序员只需要定义很多个任务,让系统去帮助我们把这些任务分配到CPU上实现并发执行呢? Go语言中的goroutine就是这样一种机制,goroutine 的概念类似于线程,但 goroutine 由

Go语言基础之并发

情到浓时终转凉″ 提交于 2021-02-13 05:30:36
[TOC] 更新、更全的《Go从入门到放弃》的更新网站,更有python、go、人工智能教学等着你: https://www.cnblogs.com/nickchen121/p/11517502.html <p>并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。</p> 一、Go语言中的并发编程 二、并发与并行 <p>并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天)。</p> <p>并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天)。</p> <p>Go语言的并发通过<code>goroutine</code>实现。<code>goroutine</code>类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个<code>goroutine</code>并发工作。<code>goroutine</code>是由Go语言的运行时(runtime)调度完成,而线程是由操作系统调度完成。</p> <p>Go语言还提供<code>channel</code>在多个<code>goroutine</code>间进行通信。<code>goroutine</code>和<code>channel</code>是 Go 语言秉承的 CSP(Communicating Sequential Process

vue路由的实现原理

元气小坏坏 提交于 2021-02-13 04:58:50
写在前面:通常 SPA 中前端路由有2种实现方式: window.history location.hash 下面就来介绍下这两种方式具体怎么实现的 一.history 1.history基本介绍 window.history 对象包含浏览器的历史,window.history 对象在编写时可不使用 window 这个前缀。history是实现SPA前端路由是一种主流方法,它有几个原始方法: history.back() - 与在浏览器点击后退按钮相同 history.forward() - 与在浏览器中点击按钮向前相同 history.go(n) - 接受一个整数作为参数,移动到该整数指定的页面,比如go(1)相当于forward(),go(-1)相当于back(),go(0)相当于刷新当前页面 如果移动的位置超出了访问历史的边界,以上三个方法并不报错,而是静默失败 在HTML5,history对象提出了 pushState() 方法和 replaceState() 方法,这两个方法可以用来向历史栈中添加数据,就好像 url 变化了一样(过去只有 url 变化历史栈才会变化),这样就可以很好的模拟浏览历史和前进后退了,现在的前端路由也是基于这个原理实现的。 2.history.pushState pushState(stateObj, title, url)