Go Reflect

最近在看一些go语言标准库以及第三方库的源码时,发现go的reflect被大量使用,虽然反射的机制大多数语言都支持,但好像都没有go一样这么依赖反射的特性。个人觉得,reflect使用如此频繁的一个重要原因离不开go的另一个特性,空接口interface{},reflect配合空接口,让原本是静态类型的go具备了很多动态类型语言的特征。 另外,虽然反射大大增加了go语言的灵活性,但要完全掌握它的原理和使用也还是有一点难度的。 go的reflect库有两个重要的类型: reflect.Type r...阅读全文

阅读:14508 评论:0

Go的异常处理 defer, panic, recover

Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。 这几个异常的使用场景可以这么简...阅读全文

2015-11-27 14:05 u013542440
阅读:1901 评论:0

Go flag包

一、命令行语法 命令行语法主要有以下几种形式: cmd -flag //只支持bool类型 cmd -flag=x cmd -flag x //只支持非bool类型 以上语法对于一个或两个‘-’号是一样的 对于整形flag,合法的值可以为1234,0664,0x1234或负数等。对于布尔型flag,可以为1,0,t,f,T,F,true,false,TRUE,FALSE,True,False等 二、命令行参数方法 (1)定义flag参数 参数有三个:第一个为参数名称,第二个为默认值,第三个是说明...阅读全文

2016-12-01 19:23 吃一堑消化不良
阅读:5404 评论:0

golang使用原始套接字构造UDP包

RAW SOCKET 介绍 TCP/IP协议中,最常见的就是原始(SOCKET_RAW)、tcp(SOCKET_STREAM)、udp(SOCKET_DGRA)三种套接字。原始套接字能够对底层传输进行控制,允许自行组装数据包,比如修改本地IP,发送Ping包,进行网络监听。这里不做详细介绍,要了解更多可以网上自己查询。 实现 这里先看IP头结构: 其中16位总长度包括IP头长度和数据的长度,8位协议填写17,因为UDP协议类型为17。这里要说明一下IP头中的首部校验,这个值只校验IP头部,不包含...阅读全文

2017-05-01 21:00:34 pinecone
阅读:4262 评论:0

golang工程师面试第三天

**1**.简述golang中make和new的区别 make用于内建类型(只能用于创建map、slice 和channel)的内存分配。并且返回一个有初始值(非零)的T类型,而不是*T。 new用于各种类型的内存分配。new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要:**new返回指针**。 **2**.简要描述go中的main和init函数的区别 首先,这两个函数应...阅读全文

2018-01-15 21:36:48 yinshidaoshi
阅读:10633 评论:20

Golang 内存管理源码剖析

Golang 的内存管理基于 tcmalloc,可以说起点挺高的。但是 Golang 在实现的时候还做了很多优化,我们下面通过源码来看一下 Golang 的内存管理实现。下面的源码分析基于 go1.8rc3。 1.tcmalloc 介绍 关于 tcmalloc 可以参考这篇文章 tcmalloc 介绍,原始论文可以参考 TCMalloc : Thread-Caching Malloc。 2. Golang 内存管理 0. 准备知识 这里先简单介绍一下 Golang 运行调度。在 Golang 里...阅读全文

2018-06-04 11:33:05 万建宁
阅读:645 评论:0