Telegram GoLnag 中文 爱好者群组
Telegram GoLnag 中文 爱好者群组 本着互相帮助的原则建立本群组,有使用电报的爱好者可以加入. https://t.me/GoFan...阅读全文
Telegram GoLnag 中文 爱好者群组 本着互相帮助的原则建立本群组,有使用电报的爱好者可以加入. https://t.me/GoFan...阅读全文
当你使用标准http库发起请求时,你得到一个http的响应变量。如果你不读取响应主体,你依旧需要关闭它。对于新的Go开发者而言,这个很容易就会忘掉。 错误的做法 resp可能为nil resp, err := http.Get(url) defer resp.Body.Close()//may panic if err != nil { return err } err不为nil,resp也不为nil 有些同学可能以为这样子修改代码就可以了 resp, err := http.Get(url) if err != nil { return err } defer resp.Body.Close() 这对于绝大多数情况是可以的,因为err不为nil往往意味着resp为nil,但是当遇到一个重定...阅读全文
我们先来看一道面试题:以下代码能编译过去吗?为什么? package main import ( "fmt" ) type People interface { Speak(string) string } type Stduent struct{} func (stu *Stduent) Speak(think string) (talk string) { if think == "bitch" { talk = "You are a good boy" } else { talk = "hi" } return } func main() { var peo People = Stduent{} think := "bitch" fmt.Println(peo.Speak(think)...阅读全文
集群模式 nats的集群模式对客户端来说并不是透明的。 所以集群对发布者和订阅者都是有影响的。 发布者和订阅者都知道连接的是一个集群的服务,而不是一个单点服务,换句话说发布者订阅者都必须指明集群中各个节点的地址。 当然,发布者和订阅者可以只针对集群中的某节点发布消息和订阅消息,不过这并不是集群模式的目的。 目的 提高可用性和可伸缩性。 实现原理 可用性,多个节点,挂掉任意一个,不影响整个集群对外提供服务。 伸缩性,服务端支持随意增加节点。订阅者可以感知服务端节点的变动,但是发布者并不能自动感知。 3个node的集群 $ gnatsd -p 4222 -m 4333 -cluster nats://localhost:4248 -routes nats://localhost:5248,nat...阅读全文
21天精品区块链课程免费学习,深入实战行家带路,助力开发者轻松玩转区块链! >>> package main import ( "fmt" "net" ) func main() { tcpAddr, _ := net.ResolveTCPAddr("tcp4", ":6000") listener, _ := net.ListenTCP("tcp", tcpAddr) defer listener.Close() for { con, err := listener.AcceptTCP() if err != nil { //fmt.Println(err) continue } fmt.Println(con.RemoteAddr().String(), " tcp connect su...阅读全文
多年C、C++开发者,刚学GO 二天,目前对着GO语言圣经练习。 https://docs.ruanjiadeng.com/gopl-zh/ch1/ch1-03.html 发现示例程序dup3和dup2的执行结果不一致, 当输入的文件最后一行不是一个换行时。 gopl.io/ch1/dup3 ```go package main import ( "fmt" "io/ioutil" "os" "strings" ) func main() { counts := make(map[string]int) for _, filename := range os.Args[1:] { da...阅读全文
本文作者: 伯乐在线 - yemengying 。未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者。前言 由于自己最近灵感枯竭,所以我决定翻译一篇别人的文章 O(∩_∩)O~。作为一个一直想学 Go,但想了好久还没入门的人,我挑了篇写 Go 的文章,顺便帮自己熟悉一下 Go。原文是 Dave Cheney 根据自己 GolangUK 的演讲所整理的,全文以 SOLID 原则为线路,讲述了什么样的 Go 代码才算是好代码,当然 SOLID 原则也适用于其他语言。 英文原文比较长,由我和 Kevin 合译。 世界上有多少个 Go 语言开发者? 介个世界上有多少 Go 开发者捏?在脑海中想一个数字,我们会在最后回到这个话题。 Code review 有多少人将 code review 当做自己工...阅读全文
 Draft 是由微软出品的一个帮助开发者在 Kubernetes 上快速创建云原生应用的工具。使用该工具,你可以不需要知道 Docker 或者 Kubernetes,就可以去开发自己的云上应用...阅读全文
method的语法如下: func (r ReceiverType) funcName(parameters) (results) 下面我们用最开始的例子用method来实现: package main import ( "fmt" "math" ) type Rectangle struct { width, height float64 } type Circle struct { radius float64 } func (r Rectangle) area() float64 { return r.width*r.height } func (c Circle) area() float64 { return c.radius * c.radius * math.Pi } func...阅读全文
Go是Google开发的一种编译型,并发型,并具有垃圾回收功能的编程语言。罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,[1],稍后Ian Lance Taylor, Russ Cox加入专案中。 Go语言这个出自大公司Google的大牛的作品, 为什么没有象出自Microsoft的anders hejlsberg的C#这么吸引人并流行起来呢?其实Go语言的设计者也是有名的大牛,但为什么三个臭皮匠,竟然抵不过一个诸葛亮呢.本人以初学者第一次接触Go语言来说说粗浅的看法. package main import "fmt" func main() { fmt.Println("Hello, World") } ...阅读全文
结构体_结构体方法(接收者).png 例子: package main import "fmt" type person struct { name string age int } func (p person)Hello() { fmt.Printf("Hello, %s\n", p.name) } // 拷贝副本,复制操作 //func (p person)Guonia() { // p.age++ //} // 传递指针(内存地址),真正修改变量值 func (p *person)ZhenGuonia() { p.age++ } func main() { //实例化一个结构体 p1 := person{ name:"小麦客", age:666, } p1.Hello() //p1....阅读全文
类型*T方法集 // code_018_struct_method_set project main.go package main import ( "fmt" ) //类型*T方法集 type Person struct { name string sex byte age int } //指针作为接收者,引用语义 func (p *Person) SetInfoPointer() { (*p).name = "yoyo" p.sex = 'f' p.age = 22 } //值作为接收者,值语义 func (p Person) SetInfoValue() { p.name = "xxx" p.sex = 'm' p.age = 33 } func main() { //p 为指针类型...阅读全文
一致性算法 - Raft Raft 状态 一个 Raft 集群包含若干个服务器节点;通常是 5 个,这允许整个系统容忍 2 个节点的失效,每个节点处于以下三种状态之一: follower(跟随者) :所有结点都以 follower 的状态开始。如果没收到 leader消息则会变成 candidate状态。 candidate(候选人):会向其他结点“拉选票”,如果得到大部分的票则成为leader。这个过程就叫做Leader选举(Leader Election)。 leader(领导者):所有对系统的修改都会先经过leader。 Raft 一致性算法 Raft通过选出一个leader来简化日志副本的管理,例如,日志项(log entry)只允许从leader流向follower。 基于lead...阅读全文
定义 Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。语法格式如下: func (variable_name variable_data_type) function_name() [return_type]{ /* 函数体*/ } package main import "fmt" type Circle struct { radius float64 } func main() { var c Circle c.radius = 10 fmt.Println("圆的面积 = ", c.getArea()) } func (c Circle) getArea() float64...阅读全文
go 方法接受者 是指针类型和非指针类型的 区别 非指针类型 package main import "fmt" // 定义接口 type Car interface { GetName() string Run() } // 定义结构体 type Tesla struct { Name string } // 实现接口的GetName()方法 func (t Tesla) GetName() string { t.Name = "test" return t.Name } // 实现接口的Run()方法 func (t Tesla) Run() { fmt.Printf("%s is running\n", t.Name) } func main() { var c Car var t T...阅读全文
关键字func和函数名之间的参数被称为receiver(接收者),将函数与接收者的类型绑在一起。如果一个函数有接收者,这个函数被称为method。不同的receiver,method可以同名这里采用封装的方法进行简述方法的妙用先看一下注册路由的方式rest.Post("/user/login", common.MakeHandler(&user.login{}))MakeHandler的方法如下,返回了一个HandlerFuncfunc MakeHandler(h Handler) rest.HandlerFunc { return func(w rest.ResponseWriter, r *rest.Request) { common_handler(w, r, h) } }具体comm...阅读全文
送給初學者的一本書http://note.youdao.com/noteshare?id=afb1b262867f6a40c5599d0bb6dd712...阅读全文
maintainer 是一个用 go 实现的,面向项目维护者的命令行工具,希望能够实现各种对维护者友好的功能。  目前包括: 生成 AUTHORS.md,记录所有贡献过代码的 Contributors 生成 CONTRIBUTING.md,描述为项目贡献的流程(未来希望能够根据不同语言做适配) 生成 CHANGELOG.md,根据项目的 Tag,Release 生成 CHANGELOG.md 已经以 Docker 分发,开箱即...阅读全文
#include
这是Go 语言的广义图形包. 它的目的是用于对任意图形,如发现强连通分量,支配者,或搜索的图形常用算法提供一个干净,透明的API。 目前该软件包正在测试, API处于半稳定状态。 功能,如 AStar 没做太大变动,对Graph, Node, 和 Edge 接口进行了一些调试...阅读全文
 事件驱动架构是计算机科学中一种高度可扩展的范例。它允许我们可以多方系统异步处理事件。 事件总线是[发布/订阅模式](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern)的实现,其中发布者发布数据,并且感兴趣的订阅者可以监听这些数据并基于这些数据作出处理。这使发布者与订阅者松耦合。发布者将数据事件发布到事件总线,总线负责将它们发送给订阅者。  type notifier interface{ notify() } type user struct{ name string email string } func (u *user) notify(){ fmt.Printf("sending user email to %s<%s>\n", u.name, u.email) } func sendNotification(n notifier){ n.notify() } func main(){ u := user{"ethan","xxx@xx.com"} sendNotification(u) //错误 //sendNotification(&u) //正确 } 上面...阅读全文
package main import ( "fmt" ) type Pointer struct { x string } func (this *Pointer) PrintX() { fmt.Printf("X:%s\n", this.x) } func (this *Pointer) SetX(str string) { this.x = str } type Value struct { x string } func (this Value) PrintX() { fmt.Printf("X:%s\n", this.x) } func (this Value) SetX(str string) { this.x = str } func main() { p1 := Pointe...阅读全文
WTF 是小型的Web框架:Web Tiny Framework WTF的目标不是重度框架,不考虑涵盖所有功能,重点放在简单和灵活性上 其实现了一个非常灵活的路由(Mux),并且路由的使用方法也极简单 还通过中间件(Midware)的方式实现了gzip等常用功能 所有的组件都通过接口来耦合,意味着开发者可以自己实现自己的组件,替换到WTF中 一个最简单的例子: 一个稍微复杂点的例子...阅读全文
在我们这个地方,你必须不停地奔跑,才能留在原地。——《爱丽斯漫游仙境》红桃皇后这句话恰恰可以作为我们这个时代的注脚!你看,我们工作节奏越来越快,越来越忙碌,永远有做不完的事情,哪怕 996 也阻止不了工作堆积成山的节奏。于是我们只能先完成任务再说,跑,跑,跑,跑得足够快,我们才能待在这个地方,至于手上流转的这些事情,完成得好不好,符不符合自己的职业规划,对自己的能力提升有没有帮助,都来不及考虑了。日复一日如此这般,有一天我们忽然发现:好像我没怎么成长啊,好像越来越没竞争力了……然而总有一天,我们会遇到更复杂的事情,需要更高的能力才能应对,怎么办?看来只好利用业余时间来学习提升啦!然而遗憾的是,我们已经处在一个不可逆转的碎片化时代,你不是在电梯里,就是在走路,不是在走路,就是在路边买早餐,不...阅读全文
网站运营的重点在于计划、安排与分配。要经营好自己的网站,你要学会该怎么去做好网站运营。网站运营是一种思维的活动,没有死板的限定,要按照自身的情况与网站的定位来知道属于你的网站运营方案。不同种类的行业、不同类型的网站都有他们特定的网站运营策划方案。接下来小编为大家分析下,网站运营方案该怎么策划。 网站运营的内容是策略,核心是决策。将网站推广等工作加以正确有力的决策执行,才能大大的发挥作用。做网站运营,是一个循序渐进的一个过程,不可能一蹴而就。需要不断的磨合和改善,才能更好的完善体系,发挥作用。 网站建设优化方面: 1.需求整理 需求采集、分析和处理是网站营运的一项重要工作。运营人员是开发人员与销售人员、客户之间沟通的桥梁。在网站营运过程中,总会产生各种需求修改和新的...阅读全文
概述 很多人(特别是新手)在写 Go 语言代码时经常会问一个问题,那就是一个方法的接受者类型到底应该是值类型还是指针类型呢,Go 的 wiki 上对这点做了很好的解释,我来翻译一下。 何时使用值类型 如果接受者是一个 map,func 或者 chan,使用值类型(因为它们本身就是引用类型)。如果接受者是一个 slice,并且方法不执行 reslice 操作,也不重新分配内存给 slice,使用值类型。如果接受者是一个小的数组或者原生的值类型结构体类型(比如 time.Time 类型),而且没有可修改的字段和指针,又或者接受者是一个简单地基本类型像是 int 和 string,使用值类型就好了。 一个值类型的接受者可以减少一定数量的垃圾生成,如果一个值被传入一个值类型接受者的方法,一个栈上的拷...阅读全文
method 1. 值与引用 varName2 = varName1 varName2.funcName() 如果 varName2 有变化,varName1 无变化,则为值类型(传递) 如果 varName2 有变化,varName1 有变化,则为引用类型(传递) 2. Method 格式: func (r [*]ReceiverType) funcName(param) (result) {...} 注: a. r 为struct对象的接收者,接收者不同,方法也不同 b. r 可以为值传递也可以为引用传递 c. param 和 result 可有可无,与普通函数一样 d. 调用方法,用 "." 连接,即 r.funcName() e. func (r *ReceiverType) fun...阅读全文
摘要: 网信办规范网上跟帖与评论;印度最高法院裁定宪法保障公民隐私权;美国专家委员会对关键基础设施安全提出预警;英国推动脱欧后与欧盟的数据交换共享伙伴关系。 e3963cf936930ce7a27288c336f6e1fe9505859b 【全球政策趋势】 印度最高法院裁定宪法保障公民隐私权 点击查看原文 概要:日前,印度最高法院作出历史性的判定,宣布宪法将保障印度公民的隐私权。该项决定可能会限制政府推广生物识别ID数据库Aadhaar计划。批评者称Aadhaar可能侵犯公民隐私权。并且,由于印度没有综合隐私保护法,公民在遇到数据泄漏情况时很难依法维权。 点评:印度最高法院的决定后,企业需要更加重视数据安全和用户隐私,尤...阅读全文
crontab是单机工具(所有worker都在调度,如果有1000个任务,所有worker都在调用者1000个任务。对于编译型语言来说,排序一个一千万的数组只需要一秒,对于一千一万的调度,无需担心性能)(相当于完成一个到worker集群的通知,通知它们杀死任务...阅读全文
作为一名开发人员,怎样才能提高自己的开发能力?本文作者以自己的亲身体验为例,即使不写大量的代码,也可以提升自己的能力,那这个方法是什么呢? [一种肯定能提高开发者编程能力的方法](http://geek.csdn.net/news/detail/214530) 那么,你在看 Go 的哪些开源项目了...阅读全文
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZYC88888/article/details/80307008 方法是特殊的函数,定义在某一特定的类型上,通过类型的实例来进行调用,这个实例被叫接收者(receiver)。 函数将变量作为参数:Function1(recv) 方法在变量上被调用:recv.Method1() 接收者必须有一个显式的名字,这个名字必须在方法中被使用。 receiver_type 叫做 (接收者)基本类型,这个类型必须在和方法同样的包中被声明。在 Go 中,(接收者)类型关联的方法不写在类型结构里面,就像类那样;耦合更加宽松;类型和方法之间的关联由接收者来建立。 方法没有和数据定义(结构体)混在一起:它们是正交的...阅读全文
/*定义接口*//*接口定义*/ type DbHander interface { Insert() Update(name,id string) Select() PrintMember() } /*定义结构体*/ type DbUser struct { userName string userId string } /*不修改内容,接收者非指针*/ func (this DbUser) Insert() { logger.Debug("insert DbUser") } /*不修改内容,接收者非指针*/ func (this DbUser) Update(name ,id string) { this.userId = id this.userName = name logger.D...阅读全文
相关命令分析 eth.blockNumber 查看当前块高。 eth.getBlock() 根据高度查看块内容。 eth.syncing 获取同步状态,可以看到全网最新块高,提示用户同步进度。 区块分析 创世区块: { difficulty: 17179869184, extraData: "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", gasLimit: 5000, gasUsed: 0, hash: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", logsBloom: "0x0000000000000000...阅读全文
##### 为什么要创建这个群? * 有众多的PHP开发人员在同时学习Swoole和Go,但目前没有一个综合的群出现 * 很多Swoole的群对PHP开发人员不是很友好,都在推广自己的开源产品,很少解答新手的问题 * 在这个开发技术日新月异的时代,只有向优秀人学习和交流,才能真正理解一些前沿的技术 * 群内有资深并且热情的golang大佬,第一时间解答疑问,解答但不限于操作系统,网络协议,服务架构方面的问题。 * 群内有资深并且热情的Swoole大佬,第一时间解答疑问,解答但不限于swoole方面的问题。 * 定位于高级PHP和希望通过学习swoole和golang来提升自己的初中级PHP,摆脱低级curd。 ##### 热情邀请你的加入 ![高级 PHP、Swoole、Go 开发者的聚集地...阅读全文
【EBNF定义】Selector = "." identifier 【EBNF解释】就是说一个'.'加上一个标识符就是一个 Selector 。 【翻译】个人觉得不能翻译成选择器,应该翻译成一次选择,因为这是一个选择的过程,见后文。 【含义】 x.f 这个选择表达式中, f 就称之为 Selector ,就是一次选择,这次选择可能选择了类型为T的一个结构体中的一个 field ,也有可能选择了这个类型相关联的 method 。更重要的是,还有可能是选择了包含在类型 T 中的匿名 field中的field或者method。 【规则】对于x.f这个选择表达式: 1.假设 x 的类型为 T 或者 *T( T 的 underlying typ...阅读全文
目的:在工厂类中选择接口的实现类来实例化,功能模块中不需要关心具体逻辑。 使用条件:已经明确不同条件下创建相应实例。 优点:调用者只需要创建一个对象并调用;扩展功能时也只需要扩展工厂类;屏蔽接口的具体实现,调用者只需要关心接口的调用。 注意:工厂模式与策略模式 差别在于此处是选择对接实体,而对接的接口功能是一致的。比如吃包子,工厂模式是选择哪家店吃包子。而策略模式是选择一家店之后,在那家店选择吃什么。 golang代码: package factorypattern import "fmt" /*定义接口*/ type Animal interface { Cry() } /*接口实现类1*/ type Dog struct { } /*接口实现类2*/ type Cat struct { ...阅读全文
命令模式 命令模式是一个高内聚的模式,其定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排除或者记录请求日志,可以提供命令的撤销和恢复功能。 命令模式包含如下角色: Command: 抽象命令类需要执行的所有命令得出在这里声明。 ConcreteCommand: 具体命令类负责实现在Command角色中定义的接口 Invoker: 调用者开始执行命令的角色,它会调用在Command角色中定义的接口。 Receiver: 接收者该角色就是干活的角色,命令传递到这里是应该被执行的 命令模式的优点 类间解耦调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只须调用Command抽象类的execute方法就可以,不需要了解到底是哪个接收者执行 可扩展性Comma...阅读全文
Golang学习 - io/ioutil 包--------------------// Discard 是一个 io.Writer 接口,调用它的 Write 方法将不做任何事情并且始终成功返回。var Discard io.Writer = devNull(0)// ReadAll 读取 r 中的所有数据,返回读取的数据和遇到的错误。// 如果读取成功,则 err 返回 nil,而不是 EOF,因为 ReadAll 定义为读取// 所有数据,所以不会把 EOF 当做错误处理。func ReadAll(r io.Reader) ([]byte, error)// ReadFile 读取文件中的所有数据,返回读取的数据和遇到的错误。// 如果读取成功,则 err 返回 nil,而不是 EOF...阅读全文
```go package main import ( "fmt" ) type Animal struct{} func (a *Animal) Escape() { a.Run() } func (a *Animal) Run() { fmt.Printf("Animal Run.\n") } type Dog struct { Animal } func (d *Dog) Run() { fmt.Printf("Dog Run.\n") } func main() { dog := Dog{} dog.Escape() } ``` 运行结果为:`Animal Run.` 但我想要的结果应该是:`D...阅读全文
做网站的人最重要的就是让自己的网站被很快的收录。大部分人需要大概1个月作用才会被收了,但是有的几个小时就收录,甚至十多分钟就可以,是不是很神奇。这些是很有技巧性的。下面说下简单的方法1,去搜索引擎提交自己的域名。2、申请一些分类目录网站收录,大概几分钟就可以申请几个。但也不要太多。3、去搜外,A5,落伍者论坛等发帖,留自己的链接。4,交换几个友情了链接。5、购买几个高质量的友情链接。做到上面这几点,最重要的还是你的网站主题和内容要健康积极,千万别复制网上的文章,就算复制也要稍微改下,不然搜索引擎会视为垃圾站点,没有原创内容,要么收录很迟要么完全不收了。现在不是有一种外链工具吗,可以批量的发出几千条外链。我觉得新站最好别这样做,这种外链没有什么意义,他的原理很简单,就是去各种有搜索功能的网站不...阅读全文
An AVL tree is a self-balancing binary search tree. In an AVLtree, the heights of the two child subtrees of any node differ byat most one; if at any time they differ by more than one,rebalancing is done to restore this property. Figures 1-4illustrate the rotation rules. Now given a sequence of insertions, you are supposed to tell theroot of the res...阅读全文
 ## **dubbo是什么** dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含:集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平...阅读全文
项目见:???? kafka cluster example 这个实例做了些什么? 搭建了拥有 3 节点 kafka、 3 节点 zookeeper 的 docker 集群服务; 分别创建了 1 个消息发布者和 2 个相同消费组的消息订阅者的 docker 应用; 使用 ab 进行并发测试,验证该实例消息的订阅 / 发布功能; 通过这个实例,能够了解些什么? 使用 Docker Compose 构建 Kafka 集群 使用 Golang 创建 Kafka Pub/Sub 实例 使用 ApacheBench 进行并发测试 使用 Makefile 简化构建操作命令 如果这个实例,对你了解 kakfa 有所帮助,请为项目添加 star ,非常感谢...阅读全文
对于普通结构体作为接收者,值和指针并没有区别。 (以下代码摘抄自Go In Action 中文版) type defaultMatcher struct{} // 方法声明为使用 defaultMatcher 类型的值作为接收者 func (m defaultMatcher) Search(feed *Feed, searchTerm string) // 声明一个指向 defaultMatcher 类型值的指针 dm := new(defaultMatch) // 编译器会解开 dm 指针的引用,使用对应的值调用方法 dm.Search(feed, "test") // 方法声明为使用指向 defaultMatcher 类型值的指针作为接收者 func (m *defaultMatcher...阅读全文
对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系。虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,而且对系统的行为进行任何较大的改动都会十分困难。结果是你不得不定义大量的子类以定制系统的行为。因此,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式. 中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。...阅读全文
方法: 指包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。 例: type Food struct{ color string taste string } func ( fruit Food) Eat() string { return fmt.Sprintf("%v,%v)", fruit.color, fruit.taset) } Food为结构体类型,Eat为Food类型的方法, Eat方法的接受者是Food类型的值(或指针 func ( fruit * Food) Eat() string)。 apple := Food{"red", "sweet"} 或 apple := &Food{"red", "sweet"} 方法使用 apple.Eat() ...阅读全文
go语言可通过struct声明新的类型 新建一个类型person type Person struct { name string age int } var p1 Person p1.name = 'liming' p1.age = 18 新建一个类型student,可以通过匿名字段将person所有字段隐式引入student type Student struct { Person //隐式引入 school string name string } s1 := Student{Person{'zhangliang',23}, 'hign school','new name'} s1.age //23 可直接访问Person的字段 s1.name //new name 最外层优先访问,重...阅读全文
继go-tour (1)之后,整理go-tour教程中,有关go语言的方法、接口和并行。 3 方法和接口 3.1 方法 Go没有类。不过你可以为结构体类型定义方法。 方法就是一类带特殊的 接收者 参数的函数。 方法接收者在它自己的参数列表内,位于 func 关键字和方法名之间。 在此例中, Abs 方法拥有一个名为 v ,类型为 Vertex 的接收者。 methods.go package main import ( "fmt" "math" ) type Vertex struct { X, Y float64 } func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main() { v :...阅读全文
在编程语言中,方法和函数的概念需要搞清楚。函数指的是一个封装的代码块,我们可以直接调用它,并返回结果。而方法其实也是一种函数,只不过方法需要和某个对象绑定。Golang并没有类的概念,不过仍然有方法和接口这些概念。 方法 方法接收者 方法接收者是一个特殊参数,给函数指定了这个参数之后,函数就成为方法了。这个特性有点像Kotlin和C#中的扩展方法,定义了带有接收者的方法之后,接收者这个类型就好像定义了这个方法一样,我们可以直接在该类型上调用方法。这在功能上,和面向对象的概念是很类似的。 例如下面这样,定义了一个汽车结构,然后定义了一个接受者方法。然后就可以用面向对象的方式来调用这个方法了。 func Method() { //方法接收者 car := Car{id: 1} car.beep(...阅读全文