精华内容
参与话题
问答
  • go语言核心编程

    2019-07-24 13:55:42
    Go语言核心编程
  • 这三部分是Go语言精华、优美、也是重要的特征,《Go语言核心编程》这本书紧密围绕这三个主题展开。以“类型系统”为例,Go语言中的类型有:简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型...

        Go语言的核心语言特性包括:类型系统、接口、并发。这三部分是Go语言精华、优美、也是重要的特征,《Go语言核心编程》这本书紧密围绕这三个主题展开。以“类型系统”为例,Go语言中的类型有:简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型、接口类型、具体类型以及类型字面量等诸多概念,这些概念在其他Go类图书里面鲜有介绍,本书试图帮助读者梳理清楚这些类型的含义,建立概念,认清类型本质并学会正确使用;在接口章节,不单介绍了接口概念和用法,还深入分析了接口的机制,使读者对Go语言非侵入式的接口有更深入的理解;在并发编程章节,书中给出了5个并发编程范式,并用图描述并发程序的模型,通俗易懂,这也是本书读特点。

        此外本书还拿出一整章内容介绍Go语言编程过程中可能遇到的陷阱,不仅告诉读者陷阱是什么,正确使用方式是什么,同时也给出出现这种问题的根本原因,使读者后续能够避免犯同样的错误。

        本书最后从哲学角度论述下Go语言的编程思想,相信Go语言爱好者一定可以从书中找到自己感兴趣内容。

    06be2cf50f719ac2fd2cc3e91e5831c4.png

    展开全文
  • Go语言核心编程视频

    2018-08-28 15:47:09
    尚硅谷 Go语言核心编程课程 全套高清视频 希望能帮到大家
  • Go语言核心编程.pdf.zip

    2019-06-28 10:54:08
    Go语言核心编程》是一本系统介绍Go 语言编程的书籍。首先介绍Go 语言的基础知识,使读者对Go 语言有一个整体的认知。接着围绕Go 语言的三大语言特性:类型系统、接口和并发展开论述,《Go语言核心编程》不单单介绍...
  • 尚硅谷 2018 Go语言核心编程课程
  • 《尚硅谷韩顺平Go语言核心编程》采用真实案例,源码级深度讲授,全面具体可落地,从理论到实践,一步一步将Go核心编程技术、编程思想、底层实现融会贯通。通过学习本教程,可掌握Go语言编程思想和底层机制,具备真正...
  • Go语言核心编程_李文塔.pdf
  • 尚硅谷的Go语言核心编程课程,讲的挺细致的,可以看看,多学点技术;如果链接过期了,请留言或者私信。
  • 接着围绕Go 语言的三大语言特性:类型系统、接口和并发展开论述,《Go语言核心编程》不单单介绍每个语言特性怎么使用,在章节的最后还对重要语言特性的底层实现原理做了介绍。接着介绍反射这个高级语言特征。
  • 课程介绍专栏作者郝林承诺:“我可以保证的是,如果你认真地跟我一起走完这个专栏,那么基本掌握 Go 语言是肯定的。至少,本专栏一定会成为你学习 Go 语言最重要的敲门砖和垫脚石。”这样的信心除了源自作者的实力...

    课程介绍

    专栏作者郝林承诺:“我可以保证的是,如果你认真地跟我一起走完这个专栏,那么基本掌握 Go 语言是肯定的。至少,本专栏一定会成为你学习 Go 语言最重要的敲门砖和垫脚石。”

    这样的信心除了源自作者的实力之外,也是由于 Go 语言本身就是一种容易入门的语言,它语法简洁、即便没有计算机的学科背景,也可以在短时间内迅速掌握。除此之外,它稳定性强、利于上手、程序库多、运行迅速的诸多优点,让它在近年快速崛起,被誉为“新世纪的 C 语言”。

    2018 年 7 月,Go 语言一举超过 Java,进入了编程语言招聘榜的前三名。许多大厂都已经拥抱 Go 语言。这其中包括以 Java 打天下的阿里巴巴,更别提那些深爱着 Go 语言的滴滴、今日头条、小米、奇虎 360、京东等明星公司。高人才需求也就意味着高额的回报,如今掌握 Go 语言已经成为了简历上的一项亮点,不但优先录取,薪资也随之一路攀升。

    本专栏从大厂面试考察的 Go 语言核心知识点和能力出发, 但不囿于面试题的知识范畴。专栏每期针对一组 Go 语言经典例题,给出典型回答和考点分析,并会详细剖析其中所涉及的核心知识点,让你熟识题目背后所考察的知识与能力,助你架构起完整的 Go 语言知识体系。

    本专栏一共分成 3 大模块,5 个章节。

    模块一:Go 语言基础知识

    1. 基础概念:讲述 Go 语言基础中的基础,包括一些基本概念和运作机制。它们都应该是你初识 Go 语言时必须知道的,同时也有助于你理解后面的知识。

    模块二:Go 语言进阶技术

    1. 数据类型和语句:Go 语言中的数据类型大都是很有特色的,你只有理解了它们才能真正玩转 Go 语言。另外,也有怎样使用各种语法和语句的相关知识

    模块三:Go 语言实战与应用

    1. Go 程序的测试:很多程序员总以为测试是另一个团队的事情,其实不然。单元测试甚至接口测试其实都应该是程序员去做的,并且应该受到重视。本部分主要解答在 Go 语言中究竟应该怎样做好测试这件事。

    2. 标准库的用法:虽然 Go 语言提供了自己的高效并发编程方式,但是同步方法依然不容忽视。这些都是我们在日常工作中很可能会用到的。

    3. Go 语言拾遗:这部分将会讲述一些我们使用 Go 语言做软件项目的过程中很可能会遇到的问题,至少会包含两篇文章,是附赠给广大 Go 语言爱好者的。

      e24a20b8f2150d4e461e26a53a0df5b1.png

      ac4a8bb202a3b096c4c30b929cabc9ea.png

      适合人群                                                             1. 希望获得更深层级进阶的 Go 语言使用者;2. 希望夯实技术的 Go 语言学习者;3. 有面试需求 / 晋升需求的开发者和在校生;4. 希望精益求精掌握多门编程语言的开发工程师。
    展开全文
  • Go语言核心编程》 第1章 基础知识 总结Go的源程序基本构成: (1)关键字引导程序的基本结构。 (2)内置类型标识符辅助声明变量和常量。 (3)字面量辅助变量和常量的初始化。 (4)分隔符帮助Go编译器识别各个token。 ...

    《Go语言核心编程》

    第1章 基础知识

    总结Go的源程序基本构成:

    • (1)关键字引导程序的基本结构。
    • (2)内置类型标识符辅助声明变量和常量。
    • (3)字面量辅助变量和常量的初始化。
    • (4)分隔符帮助Go编译器识别各个token。
    • (5)操作符和变量、关键字一起构成丰富的语法单元。
    package ***
    
    import {
    	"****"
    	"****"
    }
    
    func ***(){
    
    }
    

    复合数据类型

    指针、数组、切片、字典(map)、通道、结构和接口,它们的字面格式如下:

    *pointerType 	//指针类型使用*后面跟其指向的类型名
    [n]elementType	//数组类型使用[n]后面跟数组元素类型来表示,n表示该数组的长度
    []elementType	//切片类型使用[]后面跟切片元素类型来表示
    map[keyType][valueType]		//map类型使用map[键类型]值类型来表示
    chan valueType	//通道使用chan后面跟通道元素类型来表示
    
    struct {		//结构类型使用struct{}将各个结构字段扩起来表示
    	fieldName fieldType
    	fieldName fieldType
    }
    
    interface {		//接口类型使用interface{}将各个方法括起来表示
    	method1(inputParams)(returnParams)
    	method2(inputParams)(returnParams)
    	...
    }
    

    接口

    Go语言的接口,通过鸭子类型,实现了多态。如果一个东西,叫起来像鸭子,走起来像鸭子(实现了鸭子的叫和走的接口),那么它就是鸭子(可以实例赋值给一个鸭子接口变量)

    展开全文
  • 1.基础筑基1.1 基于线程的编程语言中的一些设计1.1.1 ThreadGroupThreadGroup是基于线程并发的编程语言中常用的一个概念,当一个线程... 然后在go语言中goroutine没有明确的这种parent/children的关系,如果想退出...

    1.基础筑基

    1.1 基于线程的编程语言中的一些设计

    1.1.1 ThreadGroup

    c46ac45d7e8efa1fd17ecbc10ae93cc1.pngThreadGroup是基于线程并发的编程语言中常用的一个概念,当一个线程派生出一个子线程后通常会加入父线程的线程组(未指定线程组的情况下)中, 最后可以通过ThreadGroup来控制一组线程的退出等操作, 然后在go语言中goroutine没有明确的这种parent/children的关系,如果想退出当前调用链上的所有goroutine则需要用到context

    1.1.2 ThreadLocal

    在基于线程的编程语言语言中,通常可以基于ThreadLocal来进行一些线程本地的存储,本质上是通过一个Map来进行key/value的存储,而在go里面并没有ThreadLocal的设计,在key/value传递的时候,除了通过参数来进行传递,也可以通过context来进行上下文信息的传递

    1.2 context典型应用场景

    场景实现原理 
    上下文信息传递WithValue通过一个内部的key/value属性来进行键值对的保存,不可修改,只能通过覆盖的方式来进行值得替换 
    退出通知WithCancel通过监听通知的channel来进行共同退出的通知 

    1.3 上下文数据的递归获取

    ade7e22a2591b855cf9acb93453c7232.png因为在go的context里面并没有使用map进行数据保存,所以实际获取的时候,是从当前层开始逐层的进行向上递归,直至找到某个匹配的key

    其实我们类比ThreadGroup,因为goroutine本身并没有上下级的概念,但其实我们可以通过context来实现传递数据的父子关系,可以在一个goroutine中设定context数据,然后传递给派生出来的goroutine

    1.4 取消的通知

    69e5cf23ff374117838af267c6c53635.png既然通过context来构建parent/child的父子关系,在实现的过程中context会向parent来注册自身,当我们取消某个parent的goroutine, 实际上上会递归层层cancel掉自己的child context的done chan从而让整个调用链中所有监听cancel的goroutine退出

    那如果一个child context的done chan为被初始化呢?那怎么通知关闭呢,那直接给你一个closedchan已经关闭的channel那是不是就可以了呢

    1.5 带有超时context

    005f0c297191deebbeb78dd32a2080ab.png如果要实现一个超时控制,通过上面的context的parent/child机制,其实我们只需要启动一个定时器,然后在超时的时候,直接将当前的context给cancel掉,就可以实现监听在当前和下层的额context.Done()的goroutine的退出

    1.6 Background与TODO

    8f4ac3a461c0e7eed6a4ca6ed5c26687.pngBackgroud其实从字面意思就很容易理解,其实构建一个context对象作为root对象,其本质上是一个共享的全局变量,通常在一些系统处理中,我们都可以使用该对象作为root对象,并进行新context的构建来进行上下文数据的传递和统一的退出控制

    那TODO呢?通常我们会给自己立很多的todo list,其实这里也一样,我们虽然构建了很多的todo list, 但大多数人其实啥也不会做,在很多的函数调用的过程中都会传递但是通常又不会使用,比如你既不会监听退出,也不会从里面获取数据,TODO跟Background一样,其背后也是返回一个全局变量

    1.7 不可变性

    通常我们使用context都是做位一个上下文的数据传递,比如一次http request请求的处理,但是如果当这次请求处理完成,其context就失去了意义,后续不应该继续重复使用一个context, 之前如果超时或者已经取消,则其状态不会发生改变

    2. 源码实现

    2.1 context接口

    type Context interface {// Deadline返回一个到期的timer定时器,以及当前是否以及到期Deadline() (deadline time.Time, ok bool)// Done在当前上下文完成后返回一个关闭的通道,代表当前context应该被取消,以便goroutine进行清理工作// WithCancel:负责在cancel被调用的时候关闭Done// WithDeadline: 负责在最后其期限过期时关闭Done// WithTimeout:负责超时后关闭doneDone() chan struct{}// 如果Done通道没有被关闭则返回nil// 否则则会返回一个具体的错误// Canceled 被取消// DeadlineExceeded 过期Err() error// 返回对应key的valueValue(key interface{}) interface{}}

    2.2 emptyCtx

    emptyCtx是一个不会被取消、没有到期时间、没有值、不会返回错误的context实现,其主要作为context.Background()和context.TODO()返回这种root context或者不做任何操作的context

    type emptyCtx intfunc (*emptyCtx) Deadline() (deadline time.Time, ok bool) {return}func (*emptyCtx) Done() chan struct{} {return nil}func (*emptyCtx) Err() error {return nil}func (*emptyCtx) Value(key interface{}) interface{} {return nil}func (e *emptyCtx) String() string {switch e {case background:return "context.Background"case todo:return "context.TODO"}return "unknown empty Context"}

    比较有意思的实现时emptyCtx的String方法,该方法可以返回当前context的具体类型,比如是Background还是TODO, 因为background和todo是两个全局变量,这里通过取其地址来进行对应类型的判断

    2.3 cancelCtx

    3b74d1f0a99588a903d6007bd5df23e1.png

    2.3.1 结构体

    cancelCtx结构体内嵌了一个Context对象,即其parent context,同时内部还通过children来保存所有可以被取消的context的接口,后续当当前context被取消的时候,只需要调用所有canceler接口的context就可以实现当前调用链的取消

    type cancelCtx struct {Contextmu       sync.Mutex            // protects following fields 保护属性done     chan struct{}         // created lazily, closed by first cancel callchildren map[canceler]struct{} // set to nil by the first cancel callerr      error                 // set to non-nil by the first cancel call}

    2.3.2 Done

    Done操作返回当前的一个chan 用于通知goroutine退出

    func (c *cancelCtx) Done() chan struct{} {c.mu.Lock()if c.done == nil {c.done = make(chan struct{})}d := c.donec.mu.Unlock()return d}

    2.3.3 cancel

    func (c *cancelCtx) cancel(removeFromParent bool, err error) {if err == nil {panic("context: internal error: missing cancel error")}// context一旦被某个操作操作触发取消后,就不会在进行任何状态的修改c.mu.Lock()if c.err != nil {c.mu.Unlock()return // already canceled}c.err = errif c.done == nil {c.done = closedchan} else {// close当前chanclose(c.done)}// 调用所有children取消for child := range c.children {child.cancel(false, err)}c.children = nilc.mu.Unlock()// 是否需要从parent context中移除,如果是当前context的取消操作,则需要进行该操作// 否则,则上层context会主动进行child的移除工作if removeFromParent {removeChild(c.Context, c)}}

    2.4 timerCtx

    54bd41df611728a7178dbdb8501a5617.pngtimerCtx主要是用于实现WithDeadline和WithTimer两个context实现,其继承了cancelCtx接口,同时还包含一个timer.Timer定时器和一个deadline终止实现

    2.4.1 结构体

    timerCtx

    type timerCtx struct {cancelCtxtimer *time.Timer // timer定时器deadline time.Time //终止时间}

    2.4.2 取消方法

    取消方法就很简单了首先进行cancelCtx的取消流程,然后进行自身的定时器的Stop操作,这样就可以实现取消了

    func (c *timerCtx) cancel(removeFromParent bool, err error) {c.cancelCtx.cancel(false, err)if removeFromParent {// Remove this timerCtx from its parent cancelCtx's children.removeChild(c.cancelCtx.Context, c)}c.mu.Lock()if c.timer != nil {c.timer.Stop() // 停止定时器c.timer = nil}c.mu.Unlock()}

    2.5 valueCtx

    其内部通过一个key/value进行值得保存,如果当前context不包含着值就会层层向上递归

    type valueCtx struct {Contextkey, val interface{}}func (c *valueCtx) String() string {return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val)}func (c *valueCtx) Value(key interface{}) interface{} {if c.key == key {return c.val}return c.Context.Value(key)}

    2.6 propagateCancel

    2.6.1 设计目标

    propagateCancel主要设计目标就是当parent context取消的时候,进行child context的取消, 这就会有两种模式:1.parent取消的时候通知child进行cancel取消2.parent取消的时候调用child的层层递归取消

    2.6.2 parentCancelCtx

    context可以任意嵌套组成一个N层树形结构的context, 结合上面的两种模式,当能找到parent为cancelCtx、timerCtx任意一种的时候,就采用第二种模式,由parent来调用child的cancel完成整个调用链的退出,反之则采用第一种模式监听Done

    func parentCancelCtx(parent Context) (*cancelCtx, bool) {for {switch c := parent.(type) {case *cancelCtx:return c, true    // 找到最近支持cancel的parent,由parent进行取消操作的调用case *timerCtx:return &c.cancelCtx, true // 找到最近支持cancel的parent,由parent进行取消操作的调用case *valueCtx:parent = c.Context // 递归default:return nil, false}}}

    2.6.3 核心实现

    func propagateCancel(parent Context, child canceler) {if parent.Done() == nil {return // parent is never canceled}if p, ok := parentCancelCtx(parent); ok {p.mu.Lock()if p.err != nil {// parent has already been canceled// 如果发现parent已经取消就直接进行取消child.cancel(false, p.err)} else {if p.children == nil {p.children = make(map[canceler]struct{})}// 否则加入parent的children map中p.children[child] = struct{}{}}p.mu.Unlock()} else {go func() {select {case parent.Done():// 监听parent DOne完成, 此处也不会向parent进行注册child.cancel(false, parent.Err())case child.Done():}}()}}

    2.7 WithDeadline

    有了上面的基础学习WithDeadline,就简单了许多, WithDeadline会给定一个截止时间, 可以通过当前时间计算需要等待多长时间取消即可

    func WithDeadline(parent Context, d time.Time) (Context, CancelFunc) {if cur, ok := parent.Deadline(); ok && cur.Before(d) {// The current deadline is already sooner than the new one.return WithCancel(parent)}c := &timerCtx{cancelCtx: newCancelCtx(parent),deadline:  d,}// 监听parent的取消,或者向parent注册自身propagateCancel(parent, c)dur := time.Until(d)if dur <= 0 {// 已经过期c.cancel(true, DeadlineExceeded) // deadline has already passedreturn c, func() { c.cancel(false, Canceled) }}c.mu.Lock()defer c.mu.Unlock()if c.err == nil {c.timer = time.AfterFunc(dur, func() {// 构建一个timer定时器,到期后自动调用cancel取消c.cancel(true, DeadlineExceeded)})}// 返回取消函数return c, func() { c.cancel(true, Canceled) }}

    2.8 Backgroup与TODO

    在很多底层的中间件的调用中都会通过context进行信息的传递,其中最常用的就是Backgroup和Todo, 虽然都是基于emptyCtx实现,但Backgroup则更倾向于作为一个parent context进行后续整个调用链context的root使用,而TODO通常则表明后续不会进行任何操作,仅仅是因为参数需要传递使用

    推荐阅读

    • 图解Go里面的sync.Map了解编程语言核心实现源码


    喜欢本文的朋友,欢迎关注“Go语言中文网

    320dc9d3073a9e5dfcc7ea0675981af6.png

    Go语言中文网启用信学习交流群,欢迎加微信274768166

    展开全文
  • 学习的视频参考b站上尚硅谷韩顺平老师的Go语言核心编程。 1.1 Golang的学习方向 Go语言,可以简单地写成Golang。 Golang学习方向: 区块链研发工程师 Go服务器端/游戏软件工程师 Golang分布式/云计算软件...
  • Go语言核心编程》一书正式上市

    千次阅读 2018-10-09 15:05:01
    市面上几乎所有的图书我都会购来阅读,但是总是感觉缺少一本讲述Go语言的三大核心:类型系统、接口、并发的图书,这么多年过去了,一直没有人写,最后我决定动手写一本这个主题的图书,书名叫《Go语言核心编程》。...
  • 本书重点介绍Go语言的实践和并发编程范式,力求让读者不但清楚并发的基本语法和原理,还学会怎么去使用。本书对Go语言规范中的命名类型、非命名类型,底层类型,动态类型等概念进行阐述,让*发者对Go的类型系统有...
  • 本文将介绍一下Go语言设计和工具链的核心团队成员。Ken Thompson大名鼎鼎、如雷贯耳,Unix操作系统的发明人之一(排在第一号),C语言前身B语言的设计者,UTF-8编码设计者之一,图灵奖得主。老爷子今年快76岁了(1943年...
  • 韩顺平讲解Go编程文档,主要是针对GO编程基础以及小案例进行讲解,最重要的是讲解了常见的算法
  • Go语言核心编程(一)

    2020-09-19 16:09:28
    Golang核心编程: 区块链(去中心化,让人人都可以参与数据库的记录)研发工程师 Go服务器端(美团)/游戏软件工程师 Golang分布式/云计算软件工程师(京东) Go语言,我们可以简单的写成Golanguage,简写为Golang...
  • 1. 锁的基础概念1.1 CAS与轮询1.1.1 cas实现锁在锁的实现中现在越来越多的采用CAS来进行,通过利用处理器的CAS指令来实现对给定变量的值交换来进行锁的获取1.1.2 轮询锁在多线程并发的情况下很有可能会有线程CAS失败...
  • Go语言核心编程(二)

    2020-09-24 16:02:56
    指针 基本介绍: 基本数据类型,变量存的就是值,也叫值类型 获取变量的地址,用&,比如:var num int,获取num的地址:&num 指针类型,变量存的是一个地址,这个地址指向的空间存的才是值 ...
  • 文章目录2.1 Go语言的特点2.2 Go语言开发工具(Mac版本)2.3 Golang执行流程分析2.4 Go程序开发注意事项2.5 Go语言的转义字符2.6 Golang中的注释形式2.7 规范的代码风格2.8 Golang标准库API文档 2.1 Go语言的特点 Go...
  • //src/runtime/runtime2.go type iface struct { tab *itab //itab存放类型及方法指针信息 data unsafe.Pointer //数据信息 } type itab struct { inter *interfacetype //接口自身的静态类型 _type *_type ...
  • Go语言核心编程---09Map

    2020-05-18 11:41:49
    文章目录9.1 map的基本介绍9.2 map的声明9.3 map的使用9.4 map的增删改查操作9.5 map遍历9.6 map切片9.7 map排序9.8 map使用细节 9.1 map的基本介绍 map是key-value数据结构,又称为字段或者关联数组。...

空空如也

1 2 3 4 5 ... 20
收藏数 608
精华内容 243
关键字:

go语言核心编程