Go中的类型断言与类型转换

类型断言 类型断言 type assertion 并不是真正的将 interface 类型转换为另一种确定的类型,只是提供了对 interface 类型的值的访问,通常情况下,这是常见的需求 类型断言通过 语法 x.(T) ,这将会确定 x 变量中存储的值是否属于 T 类型,通常场景有两种: 如果 T 不是 interface 类型,而是一个具体的类型,那么这次断言将断言 x 的 动态类型是否与 T 相同 如果 T 是 interface 类型,这次断言 x 的动态类型是否实现了 T go 1 2 3 4 5 6 7 8 9 10 11 12 var x interface{} = "foo" var s string = x.(string) fmt.Println(s) // "foo" s, ok := x.(string) fmt.Println(s, ok) // "foo true" n, ok := x....

 ·  · 

如何使用go语言来检查端口可用性

方法1:dial 使用 net.DialTimeout 去检查端口的技巧: 在通过Dial检查端口占用时,需要知道网络中常见的报错状态,而不是 err != nil 都为可用 Connection reset by peer connection reset by peer 这种错误情况下有以下几种场景: 基于包过滤的防火墙给予 RST;对于此情况,基于网络模型来说处于网络层与传输层之间的netfilter,如果是防火墙拒绝那么未到应用层无法确认端口 对端应用资源限制而reset,通常为负载过高;对于此场景是已到达应用层 客户端关闭了连接,而服务器还在给客户端发送数据;对于端口检查来说不会到这步 由上面可知,这种错误一定为占用 Connection timed out Connection timed out 这种场景根本就dial不成功,go中给出了一个专门的事件 opErr.Timeout() 来说明这个错误,故此错误将不能确认端口是否占用 Connection refused Connection refused 这种场景催在两种情况 对于 local 场景来说,这将表示端口未监听 对于远端场景来说,这种基本上表示 client 发往 remote ,remote不能接受 host:port 这个连接 通常对于存在两种情况,但多数为端口为监听 Misconfiguration, such as where a user has mistyped the port number, or is using stale information about what port the service they require is running on....

 ·  · 

Go每日一库 - gocolly

Introduction 本文对colly如何使用,整个代码架构设计,以及一些使用实例的收集。 Colly是Go语言开发的Crawler Framework,并不是一个完整的产品,Colly提供了类似于Python的同类产品(BeautifulSoup 或 Scrapy)相似的表现力和灵活性。 Colly这个名称源自 Collector 的简写,而Collector 也是 Colly的核心。 Colly Official Docs,内容不是很多,最新的消息也很就远了,仅仅是活跃在Github Concepts Architecture 从理解上来说,Colly的设计分为两层,核心层和解析层, Collector :是Colly实现,该组件负责网络通信,并负责在Collector 作业运行时执行对应事件的回调。 Parser :这个其实是抽象的,官网并未对此说明,goquery和一些htmlquery,通过这些就可以将访问的结果解析成类Jquery对象,使html拥有了,XPath选择器和CSS选择器 通常情况下Crawler的工作流生命周期大致为 构建客户端 发送请求 获取响应的数据 将相应的数据解析 对所需数据处理 持久化 而Colly则是将这些概念进行封装,通过将事件注册到每个步骤中,通过事件的方式对数据进行清理,抽象来说,Colly面向的是过程而不是对象。大概的工作架构如图 event 通过上述的概念,可以大概了解到 Colly 是一个基于事件的Crawler,通过开发者自行注册事件函数来触发整个流水线的工作 Colly 具有以下事件处理程序: OnRequest:在请求之前调用 OnError :在请求期间发生错误时调用 OnResponseHeaders :在收到响应头后调用 OnResponse: 在收到响应后调用 OnHTML:如果接收到的内容是 HTML,则在 OnResponse 之后立即调用 OnXML :如果接收到的内容是 HTML 或 XML,则在 OnHTML 之后立即调用 OnScraped:在 OnXML 回调之后调用 OnHTMLDetach:取消注册一个OnHTML事件函数,取消后,如未执行过得事件将不会再被执行 OnXMLDetach:取消注册一个OnXML事件函数,取消后,如未执行过得事件将不会再被执行 Reference goquery htmlquery Utilities 简单使用 go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package main import ( "fmt" "github....

 ·  · 

Go每日一库 - deepcopier

question: How use golang Copy one struct to another where structs have same members and different types 此时需要的库 github.com/ulule/deepcopier github.com/jinzhu/copier E.g. go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 package main import ( "fmt" "github....

 ·  · 

goland设置import规范

import 规范 引入了三种类型的包,标准库包,第三方包,程序内部包,建议采用如下方式进行组织你的包: 有顺序的引入包,不同的类型采用空格分离, 第一种标准库 第二是第三方包 第三是项目包。 在项目中不要使用相对路径引入包,在goland中可以使用如下设置自动格式化为引入标准 打开设置:Editor > Code Style > Go,选择import标签,将排序改为goimports, 剩下的按照自己喜好进行修改即可 Reference goimports-group

 ·  ·