![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go语言基础
肖肖肖肖小小
咿呀~
展开
-
【转】GO中的select3个特性
原文链接作者:大彬链接:https://segmentfault.com/a/1190000017410112来源:SegmentFault 思否select的三个特性nil的通道永远阻塞当case上读一个通道时,如果这个通道是nil,则该case永远阻塞。这个功能有1个妙用,select通常处理的是多个通道,当某个读通道关闭了,但不想select再继续关注此case,继续处理其他case,把该通道设置为nil即可。下面是一个合并程序等待两个输入通道都关闭后才退出的例子,就使用了这个特性。转载 2020-07-22 08:29:27 · 260 阅读 · 0 评论 -
【转】Golang并发模型:并发协程的优雅退出
原文链接Golang并发模型:并发协程的优雅退出本文作者:大彬前言goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞、panic、程序行为异常、数据结果不正确等问题。goroutine在退出方面,不像线程和进程,不能通过某种手段强制关闭它们,只能等待goroutine主动退出。方法一:使用for-range退出for-range是使用频率很高的结构,常用它来遍历数据,range能够感知chann转载 2020-07-21 23:46:56 · 344 阅读 · 0 评论 -
读书笔记【一】:数组、字符串、切片
Go语言的赋值和函数传参规则:除了闭包函数以引用的方式对外部变量访问之外,其他赋值和函数传参都是以传值的方式处理。数组的长度是数组类型的组成部分,不同长度或不同类型的数据组成的数据都是不同的类型,不同长度的数组因为类型不同而无法直接赋值,数组Go语言的数组是值语义。一个数组变量即表示整个数组,它并不是隐式地指向第一个元素的指针,而是一个完整的值。每一次传递或者赋值实际上都是赋值整一个数组,为了避免复制数组带来的开销,可以传递一个指向数组的指针,但是数组指针并不是数组。但是指向不同长度的数组指针的.原创 2020-07-13 09:35:19 · 174 阅读 · 0 评论 -
Go接口扫盲
Go接口接口嵌入接口,保持深度在0或1为最佳。接口中直接定义的方法数量10个之内最佳参考RuneJava的char类型是UTF-16的code unit,也就是两个字节,字符串是UTF-16 code unit的序列,因此每个字符都是定长的,要想获得某个位置字符,很容易计算出它的字节在字符串中的位置。Go语言使用UTF-8作为字符串的内部编码,因此对于大部分字符串都是ascii字符的情况下,占用的内存空间就会大大减少,但是带来的问题是,从字符串的字节slice中查找第n个字符比较麻烦,因为原创 2020-07-09 11:45:16 · 125 阅读 · 0 评论 -
modoule
设置代理首先在命令行设置GOPROXY设置代理,多个代理服务器可以用逗号隔开,direct关键字表示直连不适用代理,export GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,https://goproxy.io,direct然后cd目录到项目根目录执行go mod tidygo modules 模块化管理通过GO1111MODILE环境变量来开启或关闭,默认是autooff\on\auto:关闭,开原创 2020-07-09 11:42:46 · 592 阅读 · 0 评论 -
Go语言系列(十六):上下文context
背景在 Go http包的Server中,每一个请求在都有一个对应的 goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和RPC服务。一个上游服务通常需要访问多个下游服务,比如终端用户的身份认证信息、验证相关的token、请求的截止时间。 当一个请求被取消或超时时,所有用来处理该请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的资源。传统方案一:使用sync.WaitGroup问题:只有所有的goroutine原创 2020-07-02 07:04:52 · 599 阅读 · 0 评论 -
Go语言系列(十五):反射reflect
反射的一些基本概念和需要知道的知识Golang语言实现的反射机制就是指在运行时动态的调用对象的方法和属性,官方自带的reflect包就是反射相关的。go的变量包括type, value两部分,type 包括static type和concrete type. (static type是你在编码是看见的类型(如int、string),concrete type是runtime系统看见的类型)。类型断言能否成功,取决于变量的concrete type,而不是static type. 因此,一个 reade原创 2020-07-01 10:14:16 · 327 阅读 · 0 评论 -
Go语言中channel有关的知识点
channel容量为0和为1的区别容量为1的channel是有缓冲channel的特殊情况,可以用在2个goroutine之间同步状态,或者其中一个等待另一个完成时才继续执行任务的情况。无缓存的channel的容量始终为0,发送者发送数据和接受者接受数据时同时的,无任何中间态,不能缓冲任何数据。容量为1的channel是可以缓冲1个数据,发送者和接受者之间可以不同时进行,可以发送者可以先把数据放进去,接受者可以过会儿再读取数据。无缓存的 channel 的发送者和接受者是相互等待,发送者等待接受者准原创 2020-06-23 15:12:35 · 636 阅读 · 0 评论 -
关于接口的几个要注意的点
调用函数时的隐式转换Go 语言中的函数调用都是值传递的,变量会在方法调用前进行类型转换。import ( "fmt")// 类型转换为interface类型func printType(i interface{}) { //Go把传入函数的参数值的类型隐式的转换成 interface{} 类型。 // interface类型才能进行类型断言 switch i.(type) { case int: fmt.Println("参数的类型是 int")原创 2020-06-19 17:54:10 · 194 阅读 · 0 评论 -
Go中的一些有用的模式
参考文章pattern装饰器(Decorator)Authenticate(http.HandlerFunc(w http.ResponseWriter,r *http.Request){ // Code here})一个简单的Authenticate实现:func Authenticate(h http.Handler) http.Handler { return http.HandlerFunc(w http.ResponseWriter,r *http.Request){ if翻译 2020-06-15 16:13:45 · 173 阅读 · 0 评论 -
Go语言系列(十四) :struct{}和struct{}{}
struct{} 和 struct{}{}一般我们知道struct在Go语言中是用于定义结构类型type User struct { Name string Age int}而struct {}是一个无元素的结构体类型,通常在没有信息存储时使用。优点是大小为0,不需要内存来存储struct {}类型的值。struct {} {}是一个复合字面量,它构造了一个struct {}类型的值,该值也是空。比如我们可以用map[string]struct{}来当作成一个set来用原创 2020-06-09 20:13:20 · 3442 阅读 · 0 评论 -
Go语言系列(十三):补充一些库知识
http使用http客户端发送请求使用http.Client控制请求头部使用httputil简化工作func main() { resp, err := http.Get("http://www.baidu.com") if err != nil { panic(err) } defer resp.Body.Close() s, err := httputil.DumpResponse(resp, true) if err != nil { panic(err) } f原创 2020-06-05 15:50:36 · 426 阅读 · 1 评论 -
Go语言系列(十二):测试
测试少DEBUG,多Testinggo语言采用表格驱动测试分离的测试数据和测试逻辑明确的出错信息可以部分失败go语言的语法使得我们更容易实践表格驱动测试// 如果要测试add函数,那么文件名就叫做add_test.go// 测试方法名字就叫做TestAddpackage mainimport "testing"func add(a, b int) int { return a + b}func TestAdd(t *testing.T) { tests := [原创 2020-06-05 12:46:59 · 548 阅读 · 0 评论 -
Go语言系列(十二):复习,写一个迷宫
package mainimport ( "fmt" "os")// 广度遍历// 读取迷宫func readMaze(filename string) [][]int { file, err := os.Open(filename) if err != nil { panic(err) //这里先不做处理 } var row, col int // 行 列 fmt.Fscanf(file, "%d %d ", &row,原创 2020-06-04 22:09:35 · 294 阅读 · 0 评论 -
Go语言系列(十一):channel
channel不要通过共享内存来通信,要通过通信来共享内存channel是用来协程通信的错误做法package mainimport "fmt"func chanDemo() { // var c chan int // chan 通道里面是int类型 c == nil c := make(chan int) // 这里定义没有缓存,所以接收到一个他就会阻塞的到这个值被取走 c <- 1 // 把 1 送到c中 c <- 2 c <- 3 n:= &原创 2020-06-04 10:06:15 · 308 阅读 · 0 评论 -
Go语言系列(十):Goroutine
Goroutine协程,轻量级线程非抢占式多任务处理,由协程主动交出控制权,go1.14版本之后,也支持抢占式切换,在并发系统中,对goroutine的切换时机和运行结果就没有唯一的保证性。在go语言中,我们采用channel来进行goroutine之间的通信,能更容易的保证结果的一致性编译器/解释器/虚拟机/go语言(有自己的调度器)层面的多任务,不是系统的多个协程可以在一个或多个线程上面运行go run -race xx.go -race查看是否有数据访问冲突//func ma原创 2020-06-03 18:11:42 · 172 阅读 · 0 评论 -
go系列(五):内建容器
数组func main() { //数组的定义方式 //[0,0,0] var nums1 [3]int nums2 := [3]int{1, 2, 3} // 如果要让编译器判断我们有几个元素,要用... 没有...是切片 nums3 := [...]int{3, 4, 5} fmt.Println(nums1, nums3, nums2) // 遍历方式 // 第一种 for i:=0;i<len(nums3);i++{ fmt.Println(nums3[i])原创 2020-06-02 10:19:25 · 151 阅读 · 0 评论 -
Go系列(一):Go基础
常量、变量package mainimport "fmt"// var可以放在函数内,或直接放在包里// var a, b, c bool// var a, b string = "hello", "word"//使用var()集中定义变量// := 定义变量,只能用在函数里面// 可以不写类型 编译器可以自动辨认类型 cc = "string"var ( aa = 1 bb = 3 cc = "string")func variableZero() { var a原创 2020-06-01 21:05:04 · 223 阅读 · 0 评论 -
Go系列(四):Go的依赖管理
依赖依赖就是别人写的库依赖管理的三个阶段- GOPATH- GOVENDOR- go mod GOPATH就是给一个目录,然后我的所有的依赖就来这个目录下面找默认在~/go默认会去GOPATH的src目录下找问题:所有项目都在GOPATH目录下,这样会导致目录越来越大,几乎所有的github都镜像到GOPATH下GOVENDOR每一个项目都有一个vendor目录,用来存放第三方的库,这样的话,默认先去vendor目录下面找,然后如果找不到再去go的安装目录找,再找不到去GOP原创 2020-06-01 09:10:40 · 695 阅读 · 0 评论 -
Go系列(三):接口
接口Go语言中接口类型的独特之处在于它是满足隐式实现的。我们没有必要对于给定的具体类型定义所要满足的接口类型;简单地拥有一些必需的方法就足够了。这种设计可以让你创建一个新的接口类型满足已经存在的具体类型却不会去改变这些类型的定义。当我们使用的类型来自于不受我们控制的包时这种设计时尤其有用。接口约定具体类型:一个具体类型可以准确的描述它所代表的值,并且展示出对类型本身的一些操作方式。抽象类型: 接口类型就是一种抽象类型。他不会暴露出它所代表的对象的内部值的结构和这个对象支持的基础操作的集合。他原创 2020-06-01 21:58:29 · 174 阅读 · 0 评论 -
Go系列(二):方法
方法方法声明在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附 加到这种类型上,即相当于为这种类型定义了一个独占的方法。package geometry import ( "math")type Point struct { X,Y float64}type Path []Point// 函数func Distance(p,q Point) float64{ return math.Hypot(q.X-p.X,q.Y-p.Y)}//原创 2020-05-22 14:46:17 · 152 阅读 · 0 评论 -
Go系列(零):Go基础
Go语言入门Go是一门编译型语言,Go语言的工具链将源代码及其依赖转换成计算机的机器指令Go语言提供的工具都通过一个单独的命令go调用,go命令有一系列子命令。go run helloworld.go # run指令,编译源文件,链接库文件,并允许最终生产的可执行文件go build helloworld.go # build指令,生成名为helloworld的可执行的二进制文件go get gopl.io/ch1/helloworld # get指令,可以从网上获取代码,并放到对应目录原创 2020-06-01 21:57:56 · 431 阅读 · 0 评论 -
Go系列(六):面向对象
结构体和方法go语言仅支持封装,不支持继承和多态go语言没有class 只有structgo语言没有构造函数的说法结构创建在堆上还是栈上? 不需要知道在调用的时候,编译器很聪明的,要值还是指针,编译器会帮我们转换package mainimport "fmt"type treeNode struct { value int left, right *treeNode}// 给结构定义方法// (node treeNode):接受者 这个参数也是传值// 和普通原创 2020-06-02 19:19:50 · 113 阅读 · 0 评论 -
Go语言系列(七):接口
接口// 主函数package mainimport ( "fmt" "learn2/test")// 返回接口类型func getRetriever() retriever { return test.Retriever{} //由使用者来定义这个结构体是不是实现了retriever接口,而test.Retriever{}本身并没有和retriever有任何的关系}// 接口 接口的作用就是// something can Gettype retriever interfa原创 2020-06-03 08:42:28 · 193 阅读 · 0 评论 -
Go语言系列(八):函数式编程
函数式编程闭包闭包 = 匿名函数 + 自由变量的引用原创 2020-06-03 09:30:55 · 328 阅读 · 0 评论 -
Go语言系列(九):错误处理和资源管理
defer调用确保调用在函数结束时执行参数在调用defer语句时计算,然后押入栈中func tryDefer() { for i := 0; i < 30; i++ { defer fmt.Println(i) //29 //28 //27 //26 //.... //1 //0 }}defer列表是一个栈结构,后进先出,func tryDefer() { defer fmt.Println(3) defer fmt.Println(2)原创 2020-06-03 15:54:41 · 183 阅读 · 0 评论