精华内容
下载资源
问答
  • golang 语言高级编程。谷歌的开发程序,介绍了一些高级技巧。
  • Go语言高级编程

    2019-07-22 15:36:14
    本课程为《Go语言高级编程》一书的配套课程:Go语言高级编程涵盖CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统等高阶主题,针对Go语言有一定经验想深入了解Go语言各种高级用法的开发人员。
  • GO语言高级编程

    2018-08-28 16:17:35
    GO语言高级编程go语言越来越流行,开发爬虫,区块链等应用。
  • go语言高级编程

    2019-04-17 10:51:48
    体现的面向过程和鸭子对象的编程,以及Go语言特有的并发编程模型和错误处理哲学做了简 单介绍。最后,针对macOS、Windows、Linux几个主流的开发平台,推荐了几个较友好的 Go语言编辑器和集成开发环境,因为好的工具...
  • Go语言高级编程.tar

    2021-08-03 18:44:37
    Go语言高级编程.tar
  • go 语言高级编程,高清带标签版本。go语言圣经的进阶版
  • Go语言高级编程 Go语言代码贡献者,《Go语言高级编程》和《WebAsse...

    扫码下载「CSDN程序员学院APP」,1000+技术好课免费看

    APP订阅课程,领取优惠,最少立减5元 ↓↓↓

    订阅后:请点击此处观看视频课程

     

    视频教程-Go语言高级编程-Go语言

    学习有效期:永久观看

    学习时长:86分钟

    学习计划:2天

    难度:

     

    口碑讲师带队学习,让你的问题不过夜」

    讲师姓名:柴树杉

    Go语言码农

    讲师介绍:Go语言代码贡献者,《Go语言高级编程》和《WebAssembly标准入门》作者

    ☛点击立即跟老师学习☚

     

    「你将学到什么?」

    本课程为《Go语言高级编程》一书的配套课程:Go语言高级编程涵盖CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统等高阶主题,针对Go语言有一定经验想深入了解Go语言各种高级用法的开发人员。

     

    「课程学习目录」

    第1章:语言基础
    1.1.0 简介
    2.1.1 Go语言创世纪
    3.1.2 Hello, World 的革命
    4.1.3 数组、字符串和切片-1

     

    7项超值权益,保障学习质量」

    • 大咖讲解

    技术专家系统讲解传授编程思路与实战。

    • 答疑服务

    专属社群随时沟通与讲师答疑,扫清学习障碍,自学编程不再难。

    • 课程资料+课件

    超实用资料,覆盖核心知识,关键编程技能,方便练习巩固。(部分讲师考虑到版权问题,暂未上传附件,敬请谅解)

    • 常用开发实战

    企业常见开发实战案例,带你掌握Python在工作中的不同运用场景。

    • 大牛技术大会视频

    2019Python开发者大会视频免费观看,送你一个近距离感受互联网大佬的机会。

    • APP+PC随时随地学习

    满足不同场景,开发编程语言系统学习需求,不受空间、地域限制。

     

    「什么样的技术人适合学习?」

    • 想进入互联网技术行业,但是面对多门编程语言不知如何选择,0基础的你
    • 掌握开发、编程技术单一、冷门,迫切希望能够转型的你
    • 想进入大厂,但是编程经验不够丰富,没有竞争力,程序员找工作难。

     

    「悉心打造精品好课,2天学到大牛3年项目经验」

    【完善的技术体系】

    技术成长循序渐进,帮助用户轻松掌握

    掌握Go语言知识,扎实编码能力

    【清晰的课程脉络】

    浓缩大牛多年经验,全方位构建出系统化的技术知识脉络,同时注重实战操作。

    【仿佛在大厂实习般的课程设计】

    课程内容全面提升技术能力,系统学习大厂技术方法论,可复用在日后工作中。

     

    「你可以收获什么?」

    了解并精通CGO编程

    学习Go汇编语言,可以用汇编进行高性能优化

    学习gRPC框架,编写自己的插件

    Web框架的实现原理

     

    展开全文
  • Go语言高级编程》开源图书,涵盖CGO、Go汇编语言、RPC实现、Protobuf插件实现、Web框架实现、分布式系统等高阶主题(完稿)
  • Go语言高级编程》开源免费图书
  • go语言高级编程.pdf

    2019-06-01 21:32:21
    本书涵盖CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统等高阶主题,针对Go语言有一定经验想深入了解Go语言各种高级用法的开发人员! pdf高清带目录
  • Go语言高级编程 (Advanced Go Programming) Go中文社区最新推介版 本书涵盖CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统等高阶主题,针对Go语言有一定经验想深入了解Go语言各种高级用法的开发人员。对于刚...
  • 本书涵盖CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统等高...题,针对Go语言有一定经验想深入了解Go语言各种高级用法的开发人员。对于刚 学习Go语言的读者,建议先从《Go语言圣经》开始系统学习Go语言的基础知识
  • advanced_go_programming_test 《Go语言高级编程》部分代码实现
  • 语言高级编程 订阅 最新动态可以关注:知乎或微博 方式:观看 ,每篇文章都能收到邮件通知,或通过。 目录 序言 第一章性能分析 第二章常用数据结构 第三章并发编程 第四章编译优化 附录Go语言陷阱 基础入门 进阶...
  • go语言高级编程RPC

    2020-11-20 19:30:43
    因此Go语言的标准库也提供了一个简单的RPC实现。 1、基于gob编码的RPC Go语言的RPC包的路径为net/rpc,也就是放在了net包目录下面。RPC包是建立在net包基础之上的。 我们先构造一个HelloService类型,其中的Hello...

    RPC是远程过程调用的简称,是分布式系统中不同节点间流行的通信方式。在互联网时代,RPC已经和IPC一样成为一个不可或缺的基础构件。因此Go语言的标准库也提供了一个简单的RPC实现。

    1、基于gob编码的RPC

    Go语言的RPC包的路径为net/rpc,也就是放在了net包目录下面。RPC包是建立在net包基础之上的。

    我们先构造一个HelloService类型,其中的Hello方法用于实现打印功能:

    type HelloService struct {}
    
    type Request struct {
    A string
    }
    
    type Response struct {
        B string
    }
    func (p *HelloService) Hello(request Request, reply * Response) error {
        reply.B = "hello:" + request.A
        return nil
    }
    

    其中Hello方法必须满足Go语言的RPC规则:方法只能有两个可序列化的参数,其中第二个参数是指针类型,并且返回一个error类型,同时必须是公开的方法。

    然后就可以将HelloService类型的对象注册为一个RPC服务:

    func main() {
        rpc.RegisterName("HelloService", new(HelloService))
    
        listener, err := net.Listen("tcp", ":1234")
        if err != nil {
            log.Fatal("ListenTCP error:", err)
        }
    
        conn, err := listener.Accept()
        if err != nil {
            log.Fatal("Accept error:", err)
        }
    
        rpc.ServeConn(conn)
    }
    

    其中rpc.Register函数调用会将对象类型中所有满足RPC规则的对象方法注册为RPC函数,所有注册的方法会放在“HelloService”服务空间之下。然后我们建立一个唯一的TCP链接,并且通过rpc.ServeConn函数在该TCP链接上为对方提供RPC服务。

    下面是客户端请求HelloService服务的代码:

    func main() {
        client, err := rpc.Dial("tcp", "localhost:1234")
        if err != nil {
            log.Fatal("dialing:", err)
        }
    
        var reply Response
        err = client.Call("HelloService.Hello", Request{A: "hello"}, &reply)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(reply.B)
    }
    

    首先是通过rpc.Dial拨号RPC服务,然后通过client.Call调用具体的RPC方法。在调用client.Call时,第一个参数是用点号链接的RPC服务名字和方法名字,第二和第三个参数分别我们定义RPC方法的两个参数。

    2、跨语言的jsonrpc

    标准库的RPC默认采用Go语言特有的gob编码,因此从其它语言调用Go语言实现的RPC服务将比较困难。在互联网的微服务时代,每个RPC以及服务的使用者都可能采用不同的编程语言,因此跨语言是互联网时代RPC的一个首要条件。得益于RPC的框架设计,Go语言的RPC其实也是很容易实现跨语言支持的。

    Go语言的RPC框架有两个比较有特色的设计:一个是RPC数据打包时可以通过插件实现自定义的编码和解码;另一个是RPC建立在抽象的io.ReadWriteCloser接口之上的,我们可以将RPC架设在不同的通讯协议之上。这里我们将尝试通过官方自带的net/rpc/jsonrpc扩展实现一个跨语言的RPC。

    首先是基于json编码重新实现RPC服务:

    func main() {
        rpc.RegisterName("HelloService", new(HelloService))
    
        listener, err := net.Listen("tcp", ":1234")
        if err != nil {
            log.Fatal("ListenTCP error:", err)
        }
    
        for {
            conn, err := listener.Accept()
            if err != nil {
                log.Fatal("Accept error:", err)
            }
    
            go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
        }
    }
    

    代码中最大的变化是用rpc.ServeCodec函数替代了rpc.ServeConn函数,传入的参数是针对服务端的json编解码器。

    然后是实现json版本的客户端:

    func main() {
        conn, err := net.Dial("tcp", "localhost:1234")
        if err != nil {
            log.Fatal("net.Dial:", err)
        }
    
        client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
    
        var reply Response
        err = client.Call("HelloService.Hello", Request{A: "hello"}, &reply)
        if err != nil {
            log.Fatal(err)
        }
    
        fmt.Println(reply.B)
    }
    

    先调用net.Dial函数建立TCP链接,然后基于该链接建立针对客户端的json编解码器。

    无论采用何种语言,只要遵循同样的json结构,以同样的流程就可以和Go语言编写的RPC服务进行通信。这样我们就实现了跨语言的RPC。

    3、Http上的RPC

    Go语言内在的RPC框架已经支持在Http协议上提供RPC服务。但是框架的http服务同样采用了内置的gob协议,并且没有提供采用其它协议的接口,因此从其它语言依然无法访问的。在前面的例子已经实现了在TCP协议之上运行jsonrpc服务,并且通过nc命令行工具成功实现了RPC方法调用。现在我们在http协议上提供jsonrpc服务。

    新的RPC服务其实是一个类似REST规范的接口,接收请求并采用相应处理流程:

    func main() {
        rpc.RegisterName("HelloService", new(HelloService))
    
        http.HandleFunc("/jsonrpc", func(w http.ResponseWriter, r *http.Request) {
            var conn io.ReadWriteCloser = struct {
                io.Writer
                io.ReadCloser
            }{
                ReadCloser: r.Body,
                Writer:     w,
            }
    
            rpc.ServeRequest(jsonrpc.NewServerCodec(conn))
        })
    
        http.ListenAndServe(":1234", nil)
    }
    

    RPC的服务架设在“/jsonrpc”路径,在处理函数中基于http.ResponseWriter和http.Request类型的参数构造一个io.ReadWriteCloser类型的conn通道。然后基于conn构建针对服务端的json编码解码器。最后通过rpc.ServeRequest函数为每次请求处理一次RPC方法调用。这样就可以很方便地从不同语言中访问RPC服务了。

     

     

     

     

     

    展开全文
  • Go语言高级编程(高级Go编程) Go语言QQ群:102319854,1055927514 光谷码农课堂: ://study.163.com/provider/480000001914454/index.htm 凹语言(凹读音“ Wa”)(Wa编程语言): : 蚂蚁金服招聘云原生方向和...
  • 公众号【爱吃橙子的搬砖小徐】开通啦,后续将会同步更新,欢迎订阅 ...回复【golang】获得go语言学习三部曲 《go语言圣经》+《Mastering.GO-cn》+《go语言高级编程》 回复【数据结构】获得完整学习视频 ...

    公众号【爱吃橙子的搬砖小徐】开通啦,后续将会同步更新,欢迎订阅
    回复【java面试】获得两套面试宝典
    回复【golang】获得go语言学习三部曲
    《go语言圣经》+《Mastering.GO-cn》+《go语言高级编程》
    回复【数据结构】获得完整学习视频

    展开全文
  • Go语言高级编程读书笔记-发布订阅模型 发布订阅(publish-and-subscribe)模型通常被简写为pub/sub模型。在这个模型 中,消息生产者成为发布者(publisher),而消息消费者则成为订阅者 (subscriber),生产者和...

    Go语言高级编程读书笔记-发布订阅模型

    发布订阅(publish-and-subscribe)模型通常被简写为pub/sub模型。在这个模型 中,消息生产者成为发布者(publisher),而消息消费者则成为订阅者 (subscriber),生产者和消费者是M:N的关系。在传统生产者和消费者模型中, 是将消息发送到一个队列中,而发布订阅模型则是将消息发布给一个主题。

    为此,我们构建了一个名为 pubsub 的发布订阅模型支持包:

    // Package pubsub implements a simple multi-topic pub-sub library.
    package pubsub
    
    import (
    	"sync"
    	"time"
    )
    
    type (
    	subscriber chan interface{}         // 订阅者为一个管道
    	topicFunc  func(v interface{}) bool // 主题为一个过滤器
    )
    
    // 发布者对象
    type Publisher struct {
    	m           sync.RWMutex             // 读写锁
    	buffer      int                      // 订阅队列的缓存大小
    	timeout     time.Duration            // 发布超时时间
    	subscribers map[subscriber]topicFunc // 订阅者信息
    }
    
    // 构建一个发布者对象, 可以设置发布超时时间和缓存队列的长度
    func NewPublisher(publishTimeout time.Duration, buffer int) *Publisher {
    	return &Publisher{
    		buffer:      buffer,
    		timeout:     publishTimeout,
    		subscribers: make(map[subscriber]topicFunc),
    	}
    }
    
    // 添加一个新的订阅者,订阅全部主题
    func (p *Publisher) Subscribe() chan interface{} {
    	return p.SubscribeTopic(nil)
    }
    
    // 添加一个新的订阅者,订阅过滤器筛选后的主题
    func (p *Publisher) SubscribeTopic(topic topicFunc) chan interface{} {
    	ch := make(chan interface{}, p.buffer)
    	p.m.Lock()
    	p.subscribers[ch] = topic
    	p.m.Unlock()
    	return ch
    }
    
    // 退出订阅
    func (p *Publisher) Evict(sub chan interface{}) {
    	p.m.Lock()
    	defer p.m.Unlock()
    	delete(p.subscribers, sub)
    	close(sub)
    }
    
    // 发布一个主题
    func (p *Publisher) Publish(v interface{}) {
    	p.m.RLock()
    	defer p.m.RUnlock()
    	var wg sync.WaitGroup
    	for sub, topic := range p.subscribers {
    		wg.Add(1)
    		go p.sendTopic(sub, topic, v, &wg)
    	}
    	wg.Wait()
    }
    
    // 关闭发布者对象,同时关闭所有的订阅者管道。
    func (p *Publisher) Close() {
    	p.m.Lock()
    	defer p.m.Unlock()
    	for sub := range p.subscribers {
    		delete(p.subscribers, sub)
    		close(sub)
    	}
    }
    
    // 发送主题,可以容忍一定的超时
    func (p *Publisher) sendTopic(sub subscriber, topic topicFunc, v interface{}, wg *sync.WaitGroup) {
    	defer wg.Done()
    	if topic != nil && !topic(v) {
    		return
    	}
    	select {
    	case sub <- v:
    	case <-time.After(p.timeout):
    	}
    }
    
    

    下面的例子中,有两个订阅者分别订阅了全部主题和含有"golang"的主题:

    package main
    
    import (
    	"fmt"
    	"grpcProject/pubsub"
    	"strings"
    	"time"
    )
    
    func main() {
    	p := pubsub.NewPublisher(100*time.Millisecond, 10)
    	defer p.Close()
    	all := p.Subscribe()
    	golang := p.SubscribeTopic(func(v interface{}) bool {
    		if s, ok := v.(string); ok {
    			return strings.Contains(s, "golang")
    		}
    		return false
    	})
    	p.Publish("hello, world!")
    	p.Publish("hello, golang!")
    	go func() {
    		for msg := range all {
    			fmt.Println("all:", msg)
    		}
    	}()
    	go func() {
    		for msg := range golang {
    			fmt.Println("golang:", msg)
    		}
    	}()
    	// 运行一定时间后退出
    	time.Sleep(3 * time.Second)
    }
    

    结果:

    golang: hello, golang!
    all: hello, world!
    all: hello, golang!
    

    在发布订阅模型中,每条消息都会传送给多个订阅者。发布者通常不会知道、也不 关心哪一个订阅者正在接收主题消息。订阅者和发布者可以在运行时动态添加,是 一种松散的耦合关系,这使得系统的复杂性可以随时间的推移而增长。在现实生活 中,像天气预报之类的应用就可以应用这个并发模式。

    展开全文
  • Go语言高级编程 (Advanced Go Programming) 这本书介绍的内容比较适合已经对golang 熟悉的人,有过开发golang经验或者是有一段时间没有开发了,再重新再使用go开发的。 如果还有其它推荐的,可以留言,我更新...
  • Go语言“少即是多”的大道至简的理念让我重拾信心,寻回了久违的编程乐趣。——EndingC/C++经过几十年的发展,已经积累了庞大的软件资产,它们很多久经考验而且性能已经足够优化。Go语言必须能够站在C/C++这个巨人的...
  • Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 ...Go 语言高级编程 官方标准库 三方库 Go 语言编程网 Go 语言标准库文档中文版 ...
  • https://books.studygolang.com/advanced-go-programming-book/ch5-web/ch5-03-middleware.html
  • 附录A:Go语言常见的坑 可变参数是空接口类型时,需要注意参数展开的问题 数组是值传递 map遍历时返回顺序不固定 局部作用域中,明明的返回值会被同名的局部变量屏蔽 recover必须在defer函数中进行 main函数提前...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,971
精华内容 11,588
关键字:

go语言高级编程