ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(重)高阶特性:

2020-06-05 13:09:17  阅读:239  来源: 互联网

标签:GOPATH 语言 特性 并发 线程 Go 高阶 channel


 

1、包管理:

GOPATH、Go Modules;

l Go语言的代码复用很大程度上依赖于包管理,而包管理很大程度上依赖于环境变量GOPATH。

l GOPATH是Go语言中使用的一个环境变量,它使用绝对路径提供Go语言项目的工作目录。它适合处理大量Go语言源码、多个包组合而成的复杂工程。一般建议一个项目使用一个GOPATH,在编译过程中就不会编译错误的代码或者版本;

l Go Modules于1.11版本初步引入,在1.12版本中正式支持,它是Go官方提供的包管理解决方法。通过Go Modules,我们可以不必将项目放置到GOPATH上。Go Modules和传统的GOPATH不同,不需要包含三个子目录,一个源代码目录,甚至是空目录都可以作为Module,只要其中包含go.mod文件;

l 通过Go Modules可以轻易地进行一个包的依赖管理和版本控制,go build和go install将自动使用go.mod中的依赖关系,减少了GOPATH管理时的复杂性。

 

 

2、反射:

reflect.Type、reflect.Value

reflect.StructFied、reflect.Method

l 反射是一项功能强大的工具,它给开发人员提供了在运行时对代码本身进行访问和修改的能力。通过反射,我们可以拿到丰富的类型信息,比如变量的字段名称、类型信息和结构体信息等,并使用这些信息做一些灵活的工作;

l Go语言的反射主要通过Type和Value两个概念来表达。其中Type主要用于表示被反射变量的类型信息,而Value用于表示被反射变量自身的实例信息。Go语言反射实现主要位于reflect包中。

 

 

3、并发:

CSP并发模型、MPG线程模型

协程goroutine、通道channel、sync同步包

l Go语言中实现了两种并发模型,一种是我们熟悉的线程和锁并发模型,它主要依赖于共享内存实现。另一种是Go语言倡导使用的CSP(communicating sequential processes)通信顺序进程模型,它并发实体之间使用通道发送信息。

l Go语言的MPG模型属于一种特殊的两级线程模型(用户级线程模型、内核级线程模型),它将CPU、内核线程、线程的关系描述为M、P、G三者的关系;

Machine:一个machine对应一个内核线程,相当于内核线程在Go语言进程中的映射;

Processor:一个processor表示要执行Go代码片段的所必须的上下文环境,可以理解为用户代码逻辑的处理器;

Goroutine:是对Go语言中代码片段的封装,其实是一种轻量级的用户线程;

l P的最大数量决定了程序的并发规模,且P的最大数量是由程序决定的。可以通过修改环境变量GOMAXPROCS和调用函数runtime.GOMAXPROCS来设定最大值。

l 协程Goroutine在Go语言中属于轻量级的线程,在运行时由runtim管理;Go语言中倡导使用channel作为gorountine之间同步和通信的手段。Channel类型属于引用类型,且每个channel只能传递固定类型的数据,channel作为一个队列,它会保证数据收发顺序总是遵循先入先出的原则进行,同时它也会保证同一时刻内仅有一个gorountine访问channel来发送和获取数据;

l 带缓冲的channel,使用switch从多个channel中读取数据;

在Go语言中,除了使用channl进行gorountine之间的通信和同步操作外,还可以使用sync包下的并发工具;

sync.Mutex互斥锁:控制多goroutine穿行执行;

sync.RWMutex读写锁:同一时间段只能一个Goroutine获得写锁,但多个goroutine可获得读锁;

WaitGroup并发等待组:等待预设好数量的goroutine都提交执行结束后,才会继续往下执行代码;

Sync.Map并发安全字典:添加了同步控制的字典,原生Map不是并发安全的,在多个goroutine同时往Map中添加数据时,可能会导致添加数据的丢失;

 

总结:

Go module的出现有效解决了Go语言依赖混乱的问题;反射的能力也提供给开发商在运行时对代码进行修改的能力,方便各种框架(如注入依赖框架)的实现;独特的MPG的线程模型和CSP并发理念也为Go语言高性能、高并发的特性增分不少;

标签:GOPATH,语言,特性,并发,线程,Go,高阶,channel
来源: https://www.cnblogs.com/qingaoaoo/p/13049106.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有