
go语言
文章平均质量分 72
学海无涯书山有路
这个作者很懒,什么都没留下…
展开
-
go 函数 作为类型 - go语言
在Go语言中国 可以把 函数作为一种类型 用 type 定义。利用这种特性 ,可以进行类型转换。 可以用作函数参数的 类型 来约束参数。函数的类型转换类型转换的基本格式如下:type_name(expression)package mainimport "fmt"//声明一个函数类型type CalculateType func(int , int )// 该函数类型实现了一个方法func (c *CalculateType) Server() { fmt.Println原创 2020-08-10 19:06:47 · 431 阅读 · 1 评论 -
Go 类型断言 /类型判断
value, ok := em.(T);em 代表要判断的变量T 代表被判断的类型value 代表返回的值ok 代表是否为该类型注意:1: em 必须为interface 类型才可以进行类型断言func main() { // value, ok := em.(T); // em 代表要判断的变量 // T 代表被判断的类型 // value 代表返回的值 /...原创 2020-04-05 16:03:23 · 988 阅读 · 1 评论 -
Go Interface Go的面向对象思想
inteface接口interface 是GO语言的基础特性之一。可以理解为一种类型的规范或者约定。它跟java,C# 不太一样,不需要显示说明实现了某个接口,它没有继承或子类或“implements”关键字,只是通过约定的形式,隐式的实现interface 中的方法即可。因此,Golang 中的 interface 让编码更灵活、易扩展。如何理解go 语言中的interface ?只需...原创 2020-03-23 23:24:12 · 414 阅读 · 0 评论 -
Go中可以为哪些类型定义方法?
Go可以为任意类型添加方法。go 中 都有哪些类型可以 定义方法 ?struct 肯定可以;函数 也可以基本类型 如 int float 等 。。。。还有哪些?...原创 2020-03-22 14:59:19 · 574 阅读 · 0 评论 -
Go语言中数组与切片的区别?有哪几种方式可以创建切片?
Go 中数组属于基本类型,他们之间的赋值 是值传递/值拷贝;Go语言中,区别一个变量是数组还是切片,就看有没有定义长度;func main() { array1 := [3]int{} array2 := [2]int{1,2} array3 := [2]int{4,5} //array2 = array1 //报错! Cannot use 'array1' (type...原创 2020-03-22 14:42:08 · 476 阅读 · 1 评论 -
自己动手写Docker
Docker容器有以下3个特点:1. 轻量级2. 开放: Docker 容器基于开放标准,这使得Docker容器可以运行在主流Linux 发行版和Windows操作系统上。3. 安全容器包含用户的程序和所有的依赖,但是容器之间是共享Kernel 的。各个容器在宿主机上互相隔离,并且在用户态下运行。...原创 2020-02-29 22:43:32 · 1066 阅读 · 0 评论 -
go-micro examples中broker &event &pubsub 学习(broker发布订阅 & micro api Event + micro 订阅 & )
examples/broker : micro/go-micro/broker 发布订阅;examples/event : curl 触发 event + micro api --handler=event + micro service RegisterSubscriberexamples/pubsub : rpc clientNewPublisher...原创 2020-01-16 16:41:12 · 859 阅读 · 0 评论 -
go-micro examples 中mocking 代码学习(为方面分工开发 或测试 mock调用微服务)
对应 examples/mocking 例子这个例子 展示 了 如何 mock 调用 微服务。目录如下:helloworld : helloworld 微服务,(可假设下这是由项目中其他人开发,维护,我们只是调用)helloworld/proto/greeter.proto 代码如下:syntax = "proto3";service Greeter { ...原创 2020-01-15 10:42:26 · 7629 阅读 · 0 评论 -
go-micro examples 中noproto 代码学习(go-micro 中微服务使用json格式 来传输)
对应 examples/noproto 例子:go- micro 中微服务 都可以使用哪些 传输协议?go -micro 中 微服务中 我不想使用 protobuf 协议,或者在微服务中,我就想使用json 格式来传输 编码?目录:main.go 代码如下:package mainimport ( "context" "github.com/micro/go-mi...原创 2020-01-14 18:00:16 · 685 阅读 · 0 评论 -
go-micro examples 中stream 代码学习(流 服务及 结合浏览器websocket的使用)
对应 examples/stream 例子:这个例子, 有 一个 streaming 服务, 和两个 client, 一个是 streaming rpc , 一个是 js websockets + web services (streaming rpc)。目录:server 是 服务client : 是 rpc streaming clientweb : 是 w...原创 2020-01-14 16:12:41 · 2002 阅读 · 0 评论 -
go-micro examples 中web & form 代码学习(web类 网站的微服务架构:micro api + micro web + web service + api service)
以下对应 example/web 例子:main.go 代码如下:package mainimport ( "fmt" "log" "net/http" "github.com/micro/go-micro/web")func helloWorldHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprint...原创 2020-01-11 00:23:58 · 580 阅读 · 0 评论 -
go-micro examples 中service 代码学习(开发基于go-micro的微服务)
这是一个 创建 微服务 的例子:https://micro.mu/docs/cn/writing-a-go-service.html目录如下:greeter.proto 代码如下:syntax = "proto3";service Greeter { rpc Hello(Request) returns (Response) {}}message Request...原创 2020-01-06 19:44:52 · 590 阅读 · 0 评论 -
go-micro examples 中grpc 代码学习(开发grpc类型的微服务 和 网关)
这个例子展示了 go-micro/service/grpc 的使用方法。目录 greeter -- 问候 微服务目录 gateway -- grpc 网关创建 micro.Service : service := grpc.NewService()Pre-existing ServiceWhat if you want to add grpc to a pre-existi...原创 2020-01-06 16:46:25 · 1231 阅读 · 0 评论 -
grpc-ecosystem/grpc-gateway 基本概念和原理 / 实现网关和微服务
目标:简单微服务+ grpc-ecosystem/grpc-gateway;https://github.com/grpc-ecosystem/grpc-gatewayhttps://grpc-ecosystem.github.io/grpc-gateway/grpc-gateway 是 google bufers 协议的 编译器 protoc 的 一个插件。它 读取 proto...原创 2020-01-02 19:23:47 · 5226 阅读 · 0 评论 -
golang中使用第三方库google grpc 实现基础的微服务
使用的包:google grpc (google.golang.org/grpc);net;使用protobuf 协议;proto3 语法;目录:user.proto 代码如下:syntax = "proto3"; //指定语法格式,注意 proto3 不再支持 proto2 的 required 和 optinalpackage proto; //指定生成...原创 2020-01-02 17:38:57 · 2058 阅读 · 0 评论 -
protobuf基础概念和认知
Protocol Buffers - google的数据交换协议。Protobuf 官方定义:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍...原创 2020-01-02 17:14:20 · 624 阅读 · 0 评论 -
golang的rpc使用/ go实现简单的基础的微服务
在golang中实现RPC非常简单,有封装好的官方库和一些第三方库提供支持。golang官方的net/rpc库使用encoding/gob进行编解码,支持tcp或http数据传输方式,由于其他语言不支持gob编解码方式,所以使用net/rpc库实现的RPC方法没办法进行跨语言调用。golang官方还提供了net/rpc/jsonrpc库实现RPC方法,JSON RPC采用JSON进行数据编...原创 2020-01-02 16:52:57 · 945 阅读 · 0 评论 -
go版本发布历史
go版本发布历史 -- 概要--1.13 版本从Go 1.13开始,go命令默认使用Go module mirror和Go checksum database来下载和认证modules。语言的变化根据数字文字提案,Go1.13支持更统一和现代化的数字文字前缀前缀0b或0B表示二进制整数字面值,例如:0b1011前缀0o或0O表示八进制整数字面值,例如:0o660前缀0x...原创 2019-12-30 11:00:10 · 2069 阅读 · 1 评论 -
Go并发模式/设计模式之心跳
心跳是 并发进程向外界发出信号的一种方式两种不同类型的心跳:1。 在一段时间间隔内发出的心跳2。 在工作单元开始时发出的心跳。func main() { doWork := func(done <-chan interface{}, pulseInterval time.Duration) (<-chan interface{}, <-chan time.Tim...原创 2019-04-30 23:27:03 · 654 阅读 · 0 评论 -
Go并发模式/设计模式-重启异常的goroutine
在长期运行的后台程序中, 如果没有外部干涉,一个goroutine 很容易进入一个不正常的状态,并且无法恢复。在一个长期运行的程序中,建立一个机制来 监控 goroutine 是否 是健康的的状态 是有用的, 当它们变得异常时,就可以重启。我们将这个重启goroutine 的过程称为 "治愈 Healing"为了治愈goroutine, 需要使用心跳模式来检查我们正在监控的gorouti...原创 2019-05-04 22:11:06 · 712 阅读 · 0 评论 -
Go并发模式之context(比done channel 更加强大)-取消goroutine的好的解决方案
在并发程序中, 由于超时、取消、或系统的其他部分的故障 往往需要抢占操作。done channel 可以在你的程序中流动并取消所有阻塞的并发操作。 看起来不错,但是还不完美,还不是很够用。什么样的功能还需要呢?什么样功能才算完美呢?如果我们可以在简单的通知上附加传递额外的信息; 如 为什么取消发生, 函数是否有需要完成的最后期限(超时), 这些情况下这些功能 非常有用。contex...原创 2019-04-19 19:36:53 · 3173 阅读 · 0 评论 -
Go并发模式之 for-select
for - selectfor{ //要不就无限循环,要不就使用range 语句循环 select{ //使用channel进行作业 }}以下情况使用 for-select向channel 发送迭代变量 ---for selectfor _, s := range []string{"a", "b", "c"}{ select { ...原创 2019-03-17 18:14:39 · 8305 阅读 · 0 评论 -
Go并发模式之 约束
约束:在编写并发代码的时候,有以下几种不同的保证操作安全的方法。1。 用于共享内存的同步原语(如sync.Mutex)2. 通过通信来 共享内存来进行同步(如 channel)在并发处理中还有其他几种情况也是隐式并发安全的:3。 不会发生改变的数据4。 受到保护的数据约束:特定约束,和 词法约束特定约束:是通过公约实现约束的。 无论是由语言社区, 你所在的团队, 还是你的代码...原创 2019-03-17 17:58:20 · 187 阅读 · 0 评论 -
Go并发原语/并发组件/go并发核心语法 之select
select 语句是 将各种channel 绑定在一起的粘合剂; 连接各种组件在一起;select 语句可以帮助安全地将channel 与诸如取消,超时,等待和默认值之类 的概念结合在一起。与 switch 块不同, select 块中的case 语句没有测试顺序,如果没有满足任何条件,执行也不会失败。如果所有channel 都没有准备好,则阻塞状态直到 。当一个channel准备好了,...原创 2019-03-16 23:31:22 · 273 阅读 · 1 评论 -
Go并发原语/并发组件/go并发核心语法 之channel
channel:虽然 他们可以用来同步内存访问; 但他们最好用于在 goroutine 之间传递信息。命名: 像河流一样,一个channel充当着信息传送的管道,值可以沿着channel传递,然后在下游读出。由于这个特点,通常使用"stream" 来做 chan 变量名的后缀。创建channel 语句:var dataStream chan interface{}...原创 2019-03-16 23:14:54 · 20395 阅读 · 2 评论 -
Go并发原语/并发组件/go并发核心语法 之sync包
WaitGroupfunc main() { var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() //我们向WaitGroup 表明我们已经退出了 fmt.Println("1st goroutine sleeping...") time.Sleep(1) }() wg.Add(1) go fu...原创 2019-02-22 23:51:51 · 1320 阅读 · 2 评论 -
Go并发原语/并发组件/go并发核心语法 之goroutine
goroutine:goroutine 是一个更高级别的抽象,称为协程。协程是非抢占式的。Go语言的运行时会观察gorountine的运行时行为,并在它们阻塞时自动挂起它们,然后在他们不被阻塞时恢复它们。在某种程度上,这使它们成为可抢占的(只是在gorountine 被阻塞的情况)Go语言遵循一个称为fork-join的并发模型func main() { sayHello :...原创 2019-02-22 22:57:58 · 332 阅读 · 0 评论 -
go并发编程(传统并发存在的问题/痛点;go就是要解决这些痛点)
func main() { var data int go func() { data++ //3行 }() if data == 0{ //5行 fmt.Printf("the value is %v.\n",data) //6行 }}// the value is 0. 【结果】以上代码有三种可能的结果:1。 不打印任何东西。在这种情况下,第3行执行,...原创 2019-02-22 22:21:14 · 579 阅读 · 1 评论 -
beego框架基础
go 语言语法简明紧凑; 语法一致(对比 c static关键字,static 在不同的地方含义不同c++ vector<vector<int> > //注意> 后的空格必须有,不然会被当成 右移操作噪音少:减少不必要 ()括号 ;分号 go help gopath beego安装zhaozhiangdeMBP:ser...原创 2019-01-20 23:49:15 · 621 阅读 · 0 评论 -
Go并发模式之 防止goroutine泄漏
goroutine 有以下几种方式被终止:1。 当他完成了它的工作。2。 因为不可恢复的错误, 它不能继续工作3。 当他被告知 需要终止工作。我们可以简单的使用前两种方法, 因为这两种方法隐含在你的算法中, 但"取消工作" 又是怎样工作的呢?例如:这样情况: 子goroutine 是否该继续执行可能是以许多其他goroutine 状态的认知为基础的。通常是 main gorou...原创 2019-03-17 23:22:58 · 1638 阅读 · 0 评论 -
Go并发模式之 错误处理
不好的处理错误方式,或者说 没有进行错误处理的例子:func main() { checkStatus := func(done <-chan interface{}, urls ...string) <-chan *http.Response{ responses := make(chan *http.Response) go func() { defer ...原创 2019-03-26 22:58:02 · 938 阅读 · 0 评论 -
Go并发模式/设计模式之速率限制(API速率限制)
速率限制;它限制了某种资源在某段时间内 被访问的次数。 资源可以是任何东西: API连接, 磁盘读写, 网络包, 异常。通常情况下 用户对系统的访问应当 被沙盒化,既不会影响其他用户的活动, 也不会受到其他用户的影响。访问 收费系统 时, 速率限制可以使你与客户保持良好的关系。Google 的云服务中 就用到了 速率限制。Go语言 中 如何 进行限速呢?大多数的限速 是基于 令牌桶...原创 2019-05-03 21:01:00 · 2416 阅读 · 0 评论 -
Go并发模式/设计模式之复制请求
复制请求程序正在处理 用户的HTTP请求, 或者检索一个数据块。你可以将请求分发到多个处理程序(无论是 goroutine ,进程, 还是服务器),其中一个将比其他处理程序返回更快,可以 立即返回结果。下面例子 在 单个进程中, 使用多个goroutine 作为处理程序。goroutine 将随机休眠一段时间以模拟不同的负载,func main() { doWork := fun...原创 2019-05-02 17:34:31 · 201 阅读 · 0 评论 -
Go并发模式之异常
出现异常表示着 系统 进入了 一个无法满足用户操作的状态,这个操作可能是显式的, 也可能是隐式的。 这是需要传达一些信息:1。 发生了什么 : 对异常事件的描述2。 发生在什么时间, 什么位置 : 异常还应该包含 栈轨信息;异常还应包含对应机器上时间,并最好utc 时间。3。 对用户友好的信息 : 自定义信息;应该包括前两点的概述; 从用户角度考虑,给出信息4。 告诉用户如何获得更...原创 2019-04-21 19:59:41 · 301 阅读 · 0 评论 -
Go并发模式之队列
带缓存的 channel, 其实就是一种队列。引入队列,通常是优化程序时希望采用的最后一种技术之一。预先添加队列可以隐藏同步问题,例如死锁,和活锁。常见错误认识: 引入队列来尝试解决性能问题,队列几乎不会加速程序的总运行时间,它只会让程序的行为有所不同。举例如下:图 todo看看如下这个pipeline:p := processRequest(done, acceptConn...原创 2019-04-09 23:40:46 · 791 阅读 · 0 评论 -
Go并发模式之桥接channel(bridge channel)
作为channel 消费者 不关心其值来自一系列的channel的事实。这种情况下处理一个充满channel的 channel这种情况很多。我们可以做的是 : 将充满channel的channel 拆解为一个简单的channelfunc main() { bridge := func(done <-chan interface{}, chanStream <- chan &...原创 2019-04-07 17:34:41 · 563 阅读 · 0 评论 -
Go并发模式之将channel一分为二(tee channel)
想把一个channel 一变二;以便 将它们发送到 代码的两个不同独立区域中。func main() { tee := func(done <-chan interface{}, in <- chan interface{})( <-chan interface{}, <-chan interface {}) { out1 := make(chan inter...原创 2019-04-06 23:47:57 · 489 阅读 · 1 评论 -
Go并发模式之如何很好很强大读取channel(orDone函数)
我需要从 一个channel中读取数据; 这个channel 我不能对他行为(如: 什么时候被close(),被取消)做出假设,可以 range 读取(但是 总要判断 true 才能使用他返回的值,不爽!);for val := range myChan{ //用val 执行某些操作}可以使用 select 来包装 读操作如下:loop:for { select{ ...原创 2019-04-06 23:12:14 · 864 阅读 · 0 评论 -
Go并发模式之pipeline(管道)
pipelinepipeline 是你可以用来在系统中形成抽象的另一种工具。特别是当程序需要流式处理 或批处理数据时,它是一个非常强大的工具。pipeline 只不过是一系列将数据输入, 执行操作并将结果数据传回的系统。 将这些操作称为 pipeline 的一个 stage.通过使用pipeline, 可以分离每个stage的关注点, 这提供了很多好处。如可以可以相互独立地修改各个...原创 2019-04-06 21:35:21 · 2751 阅读 · 0 评论 -
go语言基础编程
Go语言的项目 / Go语言有哪些应用服务器编程:如处理日志, 数据打包,虚拟机处理,文件系统等;分布式系统, 数据库代理器,中间件等;网络编程: Web应用, API应用等;云平台,目前云平台逐步采用Go实现DockerKubernetes : 简称K8s ;是Google开源的一个容器编排引擎,它支持自动化部署,大规模可伸缩,应用容器化管理。在生产环境中部署一...原创 2019-01-20 02:28:06 · 1304 阅读 · 1 评论