
golang
人月神话
if not now , when?
if not me , who?
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
GO指针、值类型的区别整理
定义:A方法传一个参数p 至B方法后,当B方法改变了p的值A方法中p值也改变了就了传指针A方法中p值没改变就是传值值类型的变量:值类型的变量是直接指向内存中的值,值都是存储在栈中,当用等号进行赋值时,实际上是进行了一次拷贝, 如 i = j 实际上是进行了一次拷贝。GO中值类型有int ,float,bool,string等,除了数组、切片、结构体、channel外都是值类型&a...原创 2019-01-10 10:35:44 · 380 阅读 · 1 评论 -
GO协程间通信的同步问题
go语言的创作者的一句话:“不要通过共享内存来通讯,要通过通讯来共享内存”我们已经使用过channel, 但是在前面几例中都是使用time.Sleep()方法来保障主线不被那么快的结束,从而让子协程中的fmt.print()有机会被输出。 但是这样很不友好,也不应该被使用,用channel通讯来试试吧代码1代码思路:每次写入 in chan时也同时写入done chan, done cha...原创 2019-03-22 17:28:29 · 989 阅读 · 0 评论 -
GO chan select
select功能:可以在select中监听多个chan,哪个chan来了就处理哪个,这样的好处是可以对多个chan进行并行处理。下面给出一个例子,例子的功能是:1、创建两个chan并向其中每间隔1.5秒写入一个值,chan收到值后直接写入worker chan中2、worker chan收到值直接输出main.gopackage mainimport ( "fmt" "math...原创 2019-03-25 16:08:33 · 2375 阅读 · 0 评论 -
GO函数式编程(二叉树应用)
先看一下通常的二叉树写法,上代码:package mainimport ( "fmt")type Node struct { LeftNode *Node RightNode *Node Value int}func buildTree() Node { var tree Node tree.Value = 0 tree.LeftNode = new(Node)...原创 2019-03-13 16:14:40 · 250 阅读 · 0 评论 -
GO函数式编程详解及练习
GO是函数式编程,不是面像对象的语言,它没有对象的概念,一切都是根据结构体去分配内存,GO中的函数也是如此。先上一段代码:package mainimport "fmt"func adder1() func(i int) int { sum := 0 return func(v int) int { sum += v return sum }}func main()...原创 2019-03-13 14:03:23 · 265 阅读 · 0 评论 -
GO goroutine死锁
死锁现场1 :package mainfunc main() { ch := make(chan int) <- ch}运行结果:fatal error: all goroutines are asleep - deadlock!分析:只有一个主协程,在<-ch时就阻塞上了,并未检测到其它的活跃并相关的协程死锁现场2 :package mainimpor...原创 2019-03-21 18:32:46 · 739 阅读 · 0 评论 -
GO chan缓冲通道
非缓冲通道的工作方式是读协程在读取chan时,若读取不到会就会阻塞在那里,直到读取到数据为止。写入也是这样如果没有其它协程读取本次的写入,写入协程也同样会阻塞在这里等待。这种方式明显降低程序运行的效率,如果能写与读互不阻塞是不是就会快很多呢? 可不可以相互约定一块空间,我把数据放在指定的地方,读取者也去指定的地方读取,这样我把数据放在那里后立刻就可以去做别的事情。缓冲chan就可以做这件事情,...原创 2019-03-21 17:28:04 · 543 阅读 · 0 评论 -
GO chan单向通道
在定义chan时可以指定chan是只读或是只写,这样会使程序只读性更强,更清晰//定义只写chanvar in chan<- string//定义只读chanvar out <-chan string写段代码来试试吧:package mainimport ( "fmt" "time")//定义输入通道func worker1(in chan<- st...原创 2019-03-21 16:30:29 · 516 阅读 · 0 评论 -
GO chan思绪整理(非缓冲chan)
初次学习go chan思路整理过程,当然也不免会碰到些低级错误代码package mainimport "fmt"func main() { ch := make(chan int) ch <- 20 ch <- 21 value := <-ch fmt.Printf("%s\n",value) value = <-ch fmt.Printf...原创 2019-03-21 14:12:38 · 191 阅读 · 0 评论 -
GO接口定义与实现
如果你看它像只鸭子,那么它就是一只鸭子,这就是duck typeing的概念。如果你是个小朋友你可能会把它当作小黄鸭,如果你是个吃货可能会把它当作是别的什么东西。这个概念是有点抽像的。先上段代码看看go的接口定义与实现:GreenDuck.gopackage ducktype GreenDuck struct {}func (duck GreenDuck)GetInfo()str...原创 2019-03-12 17:27:41 · 3133 阅读 · 0 评论 -
GO手写网络爬虫三(获取珍爱城市列表)
直接上可执行的代码:发贴时这段是可直接获取到的,若你在执行时网网页结构已改变,可根据代码中的逻辑说明自行修改。package mainimport ( "bufio" "fmt" "golang.org/x/net/html/charset" "golang.org/x/text/encoding" "golang.org/x/te原创 2019-03-15 15:21:36 · 345 阅读 · 0 评论 -
GO写网络爬虫(单任务版架构设计)
说是架构设计,但是爬虫框架大同小异,这里也是说明一下原理,把之前做的一些功能给模块化到架构中。先上个图吧这就是引擎中各组件的任务职能,各施其职发挥出种组件的特点:1、种子就是原始URL没什么好说明的2、爬虫引擎对爬虫种子或其它任务进行调度3、网页获取器主要任务是对网页内容进行读取,包括网页编码解析及转码等工作4、解析器对网页内容进行解析,如何解析是要自己开发逻辑解析器的,这个解...原创 2019-03-19 18:18:31 · 338 阅读 · 0 评论 -
GO手写网络爬虫二(正则表达式匹配)
本篇主要演示一下GO用正则表达式匹配文本信息的用法,为后面的爬虫做准备工作:代码中已有详细的注释,直接贴上可执行的代码:package mainimport ( "fmt" "regexp")const text = `arno's email is arno.wang@gmail.com lisa's email is lisa.li@163.com luca...原创 2019-03-15 11:14:11 · 629 阅读 · 0 评论 -
GO手写网络爬虫一(读取网页)
直接上代码,里面有详细的注释:package mainimport ( "bufio" "fmt" "golang.org/x/net/html/charset" "golang.org/x/text/encoding" "golang.org/x/text/transform" "io" "io/ioutil" "net/http&q原创 2019-03-15 11:03:45 · 433 阅读 · 0 评论 -
GO被墙了包下载工具gopm
刚用golang的时候让我特别意外的是golang.org的包无法下载,经查证在中国大陆是被墙了,好一翻折腾后才通过github镜像把这个包给安装上了。今天发现了一个特别好用的工具,分享给大家,gopm !gopm的安装go get -u github.com/gpmgo/gopmgopm使用以下载 golang.org/x/net/html为例gopm get -g -v gola...原创 2019-03-14 18:01:57 · 5479 阅读 · 7 评论 -
GO数组与切片
定义:数组是值类型,是一组同类型数据的集合,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。切片的长度是不固定的,可以追加元素,数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型Slices切片(...原创 2019-01-10 11:44:21 · 206 阅读 · 0 评论 -
GO接口方法集
interface! method! struct!go不是面向对象的语言,它里面没有类和对象。go是函数式的编程语言,它里面只有以interface、struct、method。直接上段我整理过的可执行的代码,我在里面加入了注释,自己看吧:package mainimport "fmt"type Do interface { Speak(content string)}t...原创 2019-03-26 15:49:46 · 328 阅读 · 0 评论