Go语言中文网 为您找到相关结果 422

Go语言atomic原子操作

atomic是最轻量级的锁,在一些场景下直接使用atomic包还是很有效的。 下面内容摘秒自《GO并发编程实战》—— 原子操作: CAS操作的优势是,可以在不形成临界区和创建互斥量的情况下完成并发安全的值替换操作。 这可以大大的减少同步对程序性能的损耗。 当然,CAS操作也有劣势。在被操作值被频繁变更的情况下,CAS操作并不那么容易成功。 原子操作共有5种,即:增或减、比较并交换、载入、存储和交换 1. 增或减 被用于进行增或减的原子操作(以下简称原子增/减操作)的函数名称都以“Add”为前缀,并后跟针对的具体类型的名称。 不过,由于atomic.AddUint32函数和atomic.AddUint64函数的第二个参数的类型分别是uint32和uint64,所以我们无法通过传递一个负的数值来...阅读全文

博文 2015-06-17 20:12:43 xcltapestry

golang的net包

package net import "net" net包提供了可移植的网络I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket。 虽然本包提供了对网络原语的访问,大部分使用者只需要Dial、Listen和Accept函数提供的基本接口;以及相关的Conn和Listener接口。crypto/tls包提供了相同的接口和类似的Dial和Listen函数。 Dial函数和服务端建立连接: conn, err := net.Dial("tcp", "google.com:80") if err != nil { // handle error } fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n") status, err := bufio.Ne...阅读全文

博文 2014-10-04 19:26:40 刘地

Go语言获取本地IP地址

package main import ( "fmt" "net" "os" ) func main() { addrs, err := net.InterfaceAddrs() if err != nil { fmt.Println(err) os.Exit(1) } for _, address := range addrs { // 检查ip地址判断是否回环地址 if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil { fmt.Println(ipnet.IP.String()) } } } ...阅读全文

博文 2015-07-12 20:00:01 冷絮

golang中net包用法(二)--IP

IP地址(Internet Protocol Address,称为互联网协议地址,简写为IP Address),是一种给主机在Internet上进行编址的方式。 type IP //IP表示一个简单的IP地址,它是一个byte类型的slice,能够接受4字节(IPV4)或者16字节(IPV6)输入。注意,IP地址是IPv4地址还是IPv6地址是语义上的特性,而不取决于切片的长度:16字节的切片也可以是IPv4地址。 type IP []bytefunc IPv4(a, b, c, d byte) IP //ipv4返回一个ipv4地址格式(a.b.c.d)的地址,这是16-byte的 func ParseCIDR(s string) (IP, *IPNet, error) //ParseCI...阅读全文

博文 2015-06-18 17:06:14 chenbaoke

golang 使用 gomail 发送邮件

下面以阿里云邮箱为例, 如果使用的是qq邮箱的话需要把mailConn里面的host改成'smpt.qq.com',user 填写qq邮箱地址, pass需要填写你在qq邮箱设置里面获取到的授权码,qq邮箱需要先去邮箱设置里面开通smtp支持,然后获取授权码。然后就可以用qq邮箱发送了。 安装gomail go get gopkg.in/gomail.v2 package main import ( "gopkg.in/gomail.v2" "strconv" ) func SendMail(mailTo []string,subject string, body string ) error { //定义邮箱服务器连接信息,如果是阿里邮箱 pass填密码,qq邮箱填授权码 mailConn...阅读全文

博文 2018-11-06 18:35:49 woahjknes

让golang在Raspberry Pi上飞一会

最近在玩2样东西,一样是go语言(golang),一样是Raspberry Pi(树莓派)。那么能在Raspberry上运行go语言程序吗? Golang的文档上说是支持多平台的,其中也包括了ARM,看来有戏了,兴冲冲打开http://code.google.com/p/go/downloads/list (golang编译器的下载页面) ,却发现没有arm平台的二进制大包下载。所以arm平台下的需要下载源码自己编译。 Raspberry上编译前准备及配置 一。俗话说巧妇难为无米之炊,要编译源码先得下源码,下载后这里解压到 /home/pi/go 目录下。 二。确认需要的工具系统已经具备了:mercurial 、gcc 和 libc6-dev 。如果不确定有没有只需输入下列命令: sudo ...阅读全文

博文 2014-10-04 19:26:59 quanpower

golang中的append函数详解

1. append函数是用来在slice末尾追加一个或者多个元素。 2. 当追加元素时,发现slice的**len>cap**时,会重新开辟一个**2*cap**的内存空间去存储追加过元素的slice。 3. 如果追加元素后slice的**len<=cap**,则append返回的新生成的slice的内存地址**依旧**是传入的slice参数的内存地址。 ```go testSlice := make([]int, 0) testSlice = append(testSlice, 0) fmt.Printf("len: %d, cap: %d, data:%+v \n", len(testSlice), cap(testSlice), testSlice) //len: 1, cap: 1,...阅读全文

博文 2018-11-12 14:56:01 lijingtian

golang shadowsock 安装部署

最近一直在用ss但是python的并发并不是很好所以我改换成golang 的ss了。代码下载 编译好的直接下载 server配置(跟官方的不一样): 新建文件夹 进入文件夹后新建文件:config.json pid.cfg start.sh test.log config 是server运行的配置文件 pid.cfg 是server运行的进程号记录的位置 start.sh 是服务启动时候运行的脚本 test.log 这个是排查故障的时候用的错误记录文件 config.json 12345678{ "server":"XXX.com", //服务器ip地址或者绑定的域名 "server_port":8088, // 运行的端口 "local_port":1080, //本地运行端口 "pass...阅读全文

博文 2015-03-09 12:02:02 jianyingLi

Google 镜像站IP地址

非原版: Glgoo:http://www.glgoo.com/ 九尾搜索:http://www.jwss.com/ 谷粉搜搜:http://www.gfsswy.com/ 谷粉搜搜:http://gufensoso.com/ 谷粉恰搜:http://www.qiasou.com/ 蝴蝶:http://www.xiexingwen.com/ 一哥搜:http://www.egeso.com/ 谷歌搜:http://www.gugesou.com/ 谷壳:http://www.googke.me/ 南搜:http://nan.so/ 白鸽:http://baigeso.com/ GG搜索:http://ggsousuo.duapp.com/ 大中华:http://i.forbook.net/ ...阅读全文

博文 2015-09-08 09:00:01 Jr小王子

学习正则 - golang实现

元字符: 表1.常用的元字符 代码说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 字符转义: 如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\. 例如:deerchao\.net匹配deerchao.net,C:\\Windows匹配C:\Windows 重复: 你已经看过了前面的*,+,{2},{5,12}这几个匹配重复的方式了。下面是正则表达式中所有的限定符(指定数量的代码,例如*,{5,1...阅读全文

博文 2014-10-04 19:26:00 zhengJason

GoLang 实现一个最简单的http文件服务器

How to use github 地址:https://github.com/PolluxLee/GoServer 关闭防火墙 运行 GoServer.exe,不要关闭命令行窗口 将本地文件放到 go 文件根目录的 file 文件夹中即可实现内网共享文件 浏览器访问 http://localhost:8080/pollux/,将localhost替换成本地IP地址 GoServer.go package main import ( "log" "net/http" "os" ) func main() { os.Mkdir("file", 0777) http.Handle("/pollux/", http.StripPrefix("/pollux/", http.FileServer(h...阅读全文

博文 2017-04-04 14:51:28 PolluxLee

阿里云解析智能线路,成就完美访问!

阿里云解析一直致力于为全球域名用户提供稳定、安全、高效、智能的解析服务,从万网时代 开始,延续到现在已经走过了20年的时间。今天,来自全球超过百万的用户,接近千万级的域名,在信任并使用着云解析的服务。 2014年,云解析正式宣布支持第三方域名的解析,将服务范围从原来单纯的万网域名,扩展到支持全世界将近2000多个后缀的域名,而这一数字仍然在持续增加。 2015年10月,云解析正式推出企业付费版本,为广大企业用户提供一系列高可用、高稳定性、高安全性的解析服务方案,满足不同企业不同规模不同方向的用户需求。 2016年4月,云解析再次“壕”华升级,宣布全面支持多线路运营商分省智能解析和多线路海外国家智能解析。覆盖范围包括移动、联通、电信、教育网的全国31个省市,也包括了海外6个大洲34个...阅读全文

偷看你在干嘛!golang实现, 基于dnsmasq的dns请求获取

源码地址 什么是dnsmasq(摘自网络) Dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以为局域网电脑提供内网ip地址和路由。DNS和DHCP两个功能可以同时或分别单独实现。dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个 PXE 服务器。 更多详细 https://wiki.archlinux.org/index.php/Dnsmasq_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 什么是dnsmasq_admin? 这个东西是针对dnsmasq产生的日志做筛选,将用户...阅读全文

博文 2014-10-04 19:27:43 Able

go语言运行shell命令

// go语言运行shell命令 package main import ( "os/exec" "fmt" "os" "strings" ) func main() { var ip, whoami []byte var err error var cmd *exec.Cmd // 执行单个shell命令时, 直接运行即可 cmd = exec.Command("whoami") if whoami, err = cmd.Output(); err != nil { fmt.Println(err) os.Exit(1) } // 默认输出有一个换行 fmt.Println(string(whoami)) // 指定参数后过滤换行符 fmt.Println(strings.Trim(str...阅读全文

博文 2017-06-07 12:05:55 广训

Golang数组Array

数组Array 定义数组的格式:var package main import ( "fmt" ) func main() { //数组的长度也是类型的一部分,因此具有不同长度的数组为不同类型 var a [2]int //定义长度为2的int型数组。 var b [1]int //长度为1的int型数组 b = a fmt.Println(b)//此时编译时不通过的 } 数组的长度也是类型的一部分,因此具有不同长度的数组为不同类型 package main import ( "fmt" ) func main() { a := [20]int{19: 1} //长度为20的int型数组,索引位为19的赋值为1 b := [...]int{0: 1, 1: 2, 2: 3} //3个点代表不...阅读全文

博文 2017-09-30 09:30:01 skymyyang

判断相等的deepequal

博客地址: * [go-reflect-deepequal](https://github.com/Chasiny/Blog/edit/master/blog/go/package/go-reflect-deepequal.md) # DeepEqual ## 规则 ### 1.不同类型的值不会深度相等 Values of distinct types are never deeply equal. ```go type S1 struct { Field int } type S2 struct { Field int } func main() { fmt.Println(reflect.DeepEqual(S1{1}, S2{1})) } ``` >对应输出false ### 2.当两...阅读全文

博文 2018-05-15 16:38:37 chasiny

Golang slice 切片原理

golang 中的 slice 非常强大,让数组操作非常方便高效。在开发中不定长度表示的数组全部都是 slice 。但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果就是在实际开发中碰到很多坑,以至于出现一些莫名奇妙的问题,数组中的数据丢失了。 下面我们就开始详细理解下 slice ,理解后会对开发出高效的程序非常有帮助。 这个是 slice 的数据结构,它很简单,一个指向真实 array 地址的指针 ptr ,slice 的长度 len 和容量 cap 。 其中 len 和 cap 就是我们在调用 len(slice) 和 cap(slice) 返回的值。 我们来按照 slice 的数据结构定义来解析出 ptr, len, cap // 按照上图定义的数据...阅读全文

golang中net包用法(一)

net包对于网络I/O提供了便携式接口,包括TCP/IP,UDP,域名解析以及Unix Socket。尽管net包提供了大量访问底层的接口,但是大多数情况下,客户端仅仅只需要最基本的接口,例如Dial,LIsten,Accepte以及分配的conn连接和listener接口。 crypto/tls包使用相同的接口以及类似的Dial和Listen函数。下面对net包进行具体分析。 首先介绍其中常量: const ( IPv4len = 4 IPv6len = 16 ) 很容易看出这表示ip地址的长度(bytes),其中ipv4长度是4,ipv6地址长度是16 变量: 常用的ipv4地址: var ( IPv4bcast = IPv4(255, 255, 255, 255) // 广播地址 IP...阅读全文

博文 2015-06-17 20:17:00 chenbaoke

golang发送邮件

经测试成功 转自http://blog.csdn.net/zistxym/article/details/20235023 package main import ( "log" "net/smtp" "flag" "fmt" "strings" ) var ( subject = flag.String( "s","","subject of the mail" ) body= flag.String( "b","","body of themail" ) reciMail = flag.String( "m","","recipient mail address" ) ) func main() { // Set up authentication information. flag.P...阅读全文

博文 2015-06-18 17:04:34 u012210379

Go语言 传值和传指针性能对比

载自达达的博客 以往的C编程经验告诉我们,指针传参会有更好的性能,在Go语言中,这条经验也是通用的。但是需要留意两个问题: 指针传参会导致参数的操作领域不确定,到底函数内部会不会改变传入的对象呢?Go语言中没有类型C那样的const关键字,所以无法控制。Go语言是有GC的,并且这个GC还不是很完善,受对象数量影响较大,传递指针意味着可能多创建不必要的对象,到底指针传参带来的性能提升能不能抵消创建对象产生的GC压力呢?这是一个不好观察到的数据。(原作者达达这里应该是有错误的,首先传值也是复制,要产生一个新对象,分配内存地址传到新的函数中,其次指针一般来说64个字节,复制的代价远小大中型数据传值,因此在都产生一个新对象的情况下,指针还是远优先于传大中型的值结构) 下面是性能消耗的测试代码: pa...阅读全文

博文 2014-10-09 18:00:00 abv123456789

使用Go语言计算网络IP地址的CIDR

使用了Java、C#等许多语言好多年了,一直没怎么用过这些语言中的位移运算符,最近为了实现了一个小功能,才体会到这几个运算符的用途。在介绍如何用GO语言计算CIDR地址段之前,先介绍一下什么是网络地址的CIDR。 CIDR全称Classless Inter-Domain Routing(无类域间路由),相比CIDR,现在全球的IPV4地址(通过32位比特位表示)早在上世纪80年代就被划分成了A、B、C、D、E五大类地址,其中A类地址的比特位以0开头,B类地址以10打头,C类地址以110打头,D类地址以1110打头,E类地址以1111打头。其中D类地址主要用于路由组播,E类地址暂时保留。每一类地址剩余的比特部分又被划分为网络和主机两部分,具体划分请见下图: 每一类IP地址具体范围如下图所示,其...阅读全文

博文 2015-06-17 23:01:28 duhf_think

Go如何发送广播包

网络数据包的发送分为三种方式,分别是单播、组播、广播。 广播通俗地讲,就是让你的机器发送的数据包可以被同一个网络内的所有主机都接收到。 在讲解如何发送广播包之前,先来看看跟广播有关的知识: 我们都知道IP地址的作用是用来在网络中定位某个网络接口的(没错,准确的讲,IP并不是定位某一台主机)。我们通常见到的IP地址的形式都是如下这样子的: XXX.XXX.XXX.XXX 这种IP地址的形式叫做点分十进制表示法,其实IP是一个32位长的二进制数,以每8位为单位,共分成4个部分,也就是分成了4个字节。 IP地址的组成方式是: [网络号]+[主机号] 网络号是用来标识某个网络的,而主机号是用来标识网络中的某一台主机的(其实是主机上的某个接口)。 通常计算机发送一个数据包时会在数据包的头部加上发送者的...阅读全文

博文 2015-11-03 15:00:15 u011774512

Go 语言的数据结构:链表

数据结构和算法是计算机科学的重要组成部分。虽然有时候它们看起来很吓人,但大多数算法都有简单的解释。同样,当问题能用算法来解释清楚的时候,算法的学习和应用也会很有趣。 这篇文章的目标读者是那些对链表感到不舒服的人,或者那些想要看到并学习如何用 Golang 构建一个链表的人。我们将看到如何通过一个(稍微)实际的例子来实现它们,而不是简单的理论和代码示例。 在此之前,让我们来谈谈一些理论。 ## 链表 链表是比较简单的数据结构之一。维基百科关于链接列表的文章指出: > 在计算机科学中,链表是数据元素的线性集合,其中线性顺序不是由它们在内存中的物理位置所给出的。相反,每个元素指向下一个元素。它是由一组节点组成的数据结构,它们共同代表一个序列。在最简单的形式下,每个节点都由数据和一个指向下个节点的引...阅读全文

博文 2018-03-25 23:02:44 SergeyChang

golang tcp socket

golang tcp socket编程和http差不多的感觉,也是请求应答的方式,TCP请求需要(ip地址,协议,端口)这三项,跟http请求差不多,我们现在来模拟一个请求和应答来,请求的一方我们就叫做client.go package main import ( "fmt" "io/ioutil" "net" "os" ) func main() { tcpAddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:7777") //获取一个TCP地址信息,TCPAddr checkError(err) conn, err := net.DialTCP("tcp", nil, tcpAddr) //创建一个TCP连接:TCPConn checkEr...阅读全文

博文 2014-11-03 15:00:02 别人说我名字很长

互联网公司【招聘Go语言开发】【北京朝阳区大望路】【初、中、高级均可】

QQ:2022722910(Alice),简历投递邮箱:2022722910(Alice)。 Go语言开发工程师(初、中、高 2-4人) 岗位职责: 1、设计并开发公司基础平台服务相关系统,包括长连接服务、推送系统、消息队列等; 2、设计并实现核心业务逻辑; 3、对研发过程中的问题分析和总结,且不断通过技术革新、架构优化以提升研发效率 任职要求: 1、2年以上c/c++/golang经验(至少精通一门); 2、熟悉TCP/IP,Http,Https,UDP等网络协议; 3、熟悉主流Web框架,了解框架设计和实现原理 4、具有较强的学习能力、分析问题和解决问题能力、对技术有钻研精神和兴趣、有良好的业务意识; 补充说明:211、985 本科及以上 ,计算机...阅读全文

go net 包详解1

/** * Created by Administrator on 13-12-9. */ package main import ( "fmt" "os" "net" ) /** * 将string类型的ip地址转换为IP对象 */ func main() { name := "192.168.1.97" ip := net.ParseIP(name) if ip == nil { fmt.Fprintf(os.Stderr, "Err:无效的地址") return } fmt.Fprintf(os.Stdout, "IP: %s %s\n", ip, ip.String()) defaultMask := ip.DefaultMask() fmt.Fprintf(os.Stdout, "...阅读全文

博文 2015-06-18 09:03:55 eclipser1987

北京互联网公司【招聘高级Go语言开发】【北京朝阳区大望路】

Go语言开发工程师 岗位职责: 1、设计并开发公司基础平台服务相关系统,包括长连接服务、推送系统、消息队列等; 2、设计并实现核心业务逻辑; 3、对研发过程中的问题分析和总结,且不断通过技术革新、架构优化以提升研发效率 任职要求: 1、2年以上c/c++/golang经验(至少精通一门); 2、熟悉TCP/IP,Http,Https,UDP等网络协议; 3、熟悉主流Web框架,了解框架设计和实现原理 4、具有较强的学习能力、分析问题和解决问题能力、对技术有钻研精神和兴趣、有良好的业务意识; 联系方式: QQ:2022722910(Alice),简历投递邮箱:2022722910@qq.com。 补充说明: 重点本科及以上学历 ,计算机相关专业,技术...阅读全文

Golang笔记之值类型和引用类型

值类型:所有像int、float、bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中。当使用等号=将一个变量的值赋给另一个变量时,如 j = i ,实际上是在内存中将 i 的值进行了拷贝。可以通过 &i 获取变量 i 的内存地址 引用类型:复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。一个引用类型的变量r1存储的是r1的值所在的内存地址(数字),或内存地址中第一个字所在的位置,这个内存地址被称之为指针,这个指针实际上也被存在另外的某一个字中。 局部变量被声明后必须在相同的代码块中使用它,否则会得到编译错误,全局变量允许声明但不使用 如果要交换两个变量(已声明且赋值)的值,可以简单地使用a,b = b,a,这被称为并...阅读全文

博文 2017-05-17 12:23:47 弧度里的微笑

Go 语言指针

Go 语言指针Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。接下来让我们来一步步学习 Go 语言指针。我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。以下实例演示了变量在内存中地址:package main import "fmt" func main() { var a int = 10 fmt.Printf("变量的地址: %x\n", &a ) }执行以上代码输出结果为:变量的地址: 20818a220现在我们已经了解了什么是内存地址和如何去反问它。接下来我们将具体介绍指针。什么是指针一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。类似于变量和常量,...阅读全文

博文 2016-01-31 05:00:01 u011225629

使用Golang写出高并发代码

本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章。觉得好的话,顺手分享到朋友圈吧,感谢支持。 笔者目前处于失业状态,之前一直对Golang如何处理高并发http请求的一头雾水,这几天也查了很多相关博客,似懂非懂,不知道具体代码怎么写 下午偶然在开发者头条APP上看到一篇国外技术人员的一篇文章用Golang处理每分钟百万级请求,看完文章中的代码,自己写了一遍代码,下面自己写下自己的体会 核心要点 将请求放入队列,通过一定数量(例如CPU核心数)goroutine组成一个worker池(pool),workder池中的worker读取队列执行任务,最理想的状况下,CPU的所有核并行执行任务 实例代码 以下代码笔者根据自...阅读全文

博文 2017-09-07 11:34:46 tomorrowwu

利用阿里云ECS跳板机内网穿透- ssh

背景: 暴露私网的一台机器,公网可访问。由于坑爹的电信没有给固定的公网IP,所以没法在路由器上配置公网转发。 网上google后,发现ssh的强大,一条命令搞定。 ``` ssh -fNgR 2222:127.0.0.1:22 101.37.XX.XX ``` 命令 | 含义 ---|--- -R port:host:port | 将远程机器的端口映射到本地。第一个port是远端服务器port,第二个port是本地port,ip地址是本地IP -f | 告诉SSH客户端在后台运行 -g | 允许远程主机可远程访问,这里有坑,下面会解释。 -N |Do not execute a shell or command. 不执行脚本或命令,通常与-f连用。 工作原理: 1、本地主机和远程主机建立连接...阅读全文

博文 2018-04-12 19:23:56 nbg_xuan

golang中值类型/指针类型的变量区别总结

前言 值类型:所有像int、float、bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中。当使用等号=将一个变量的值赋给另一个变量时,如 j = i ,实际上是在内存中将 i 的值进行了拷贝。可以通过 &i 获取变量 i 的内存地址 指针类型:简单地说go语言的指针类型和C/C++的指针类型用法是一样的,除了出去安全性的考虑,go语言增加了一些限制,包括如下几条: 不同类型的指针不能互相转化,例如*int, int32, 以及int64 任何普通指针类型*T和uintptr之间不能互相转化 指针变量不能进行运算, 比如C/C++里面的++, --运算 下面将给大家详细介绍golang中值类型/指针类型的变量的一些区别,下面话不多...阅读全文

博文 2017-12-11 21:00:01 yoyonow

golang map遍历

map 遍历 遍历的顺序是随机的 基本的遍历方式 func main() { m := map[string]int{ "a": 1, "b": 2, } for k, v := range m { fmt.Println(k, v) } } /* 可能的输出之一 a 1 b 2 */ /* 可能的输出之二 b 2 a 1 */ 遍历的时候元素的顺序是随机的,有可能先输出a,也有可能先输出b 在遍历中增加元素 在遍历的同时增加元素,增加的元素是可以被遍历到的 func main() { m := map[string]int{ "a": 1, "b": 2, } for k, v := range m { m["c"] = 3 fmt.Println(k, v) } } /* 输出 b 2 ...阅读全文

基于Golang的IP地址信息查询服务

工作中经常会有通过IP匹配用户信息的需求,如确定用户所在的地区(国家/省份/城市)、运营商、时区、经纬度等等。前一阵有个Golang开发的项目也有这样的需求,于是简单实现了一个包,最近忙里偷闲又包了一个支持HTTP和GRPC方式调用的服务,并开源在GitHub上了。本文主要介绍IP地址信息查询的实现细节和使用方式。 首先交代一下GitHub地址: IpQuery Golang Package:https://github.com/tabalt/ipquery IP地址信息查询服务:https://github.com/tabalt/ipqueryd 欢迎大家在项目中使用(已通过N亿日PV服务的考验),有任何问题或建议,请提交Issue反馈或Fork到自己名下修改后提交Pull Request...阅读全文

博文 2017-11-22 09:03:26 mickelfeng

go中string和slice no-copy转换

在go里面,string和slice的互换是需要进行内存拷贝的,虽然在底层,它们都只是用 pointer + len来表示的一段内存。 通常,我们不会在意string和slice的转换带来的内存拷贝性能问题,但是总有些地方需要关注的,刚好在看vitess代码的时候,发现了一种很hack的做法,string和slice的转换只需要拷贝底层的指针,而不是内存拷贝。当然这样做的风险各位就要好好担当了: func String(b []byte) (s string) { pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) pstring...阅读全文

博文 2015-06-18 09:09:35 siddontang

使用golang快速开发微信公众平台(一):开启服务器配置

微信公众平台的开发,说穿了一文不值,因为公众平台存在的目的就是给人用的,不存在什么技术门槛,但过程中坑实在太多,记录下来,希望能帮到其他人吧。 找到入口 在基本配置菜单中,可以看到修改配置按钮(群里真有找不到的),点进去 填参数 如果服务器已经通过nginx等方式将地址映射到了80端口,可以像这么写(Token和Key当然已经换掉了) 开始搓代码 在文档中,官方是这么写的:将这3个参数按照字典序排序,刚开始我是懵逼的,后来发现就是各语言版本的sort…接下来就好说了 我们加个路由,这个地址就是填入服务器配置中的url 接着在controllers中添加WxConnect.go文件 package controllers import ( "github.com/astaxie/beego" ...阅读全文

博文 2016-10-13 14:00:03 u012210379

关于golang中的引用类型(reference type)

map,指针(pointers),还有slice,按照我的理解,这样的一个变量,存的就是个内存地址,而这样的一个声明 var a map[int]string var p *int var arr []string 在没有初始化之前都是nil,对这样的一个变量进行写(write)操作,都会抛出一个运行异常(a runtime panic),当然,append操作是可以的,或者用在声明的同时用make初始化一下也可以。 现在需要去验证的是,初始化的map或者slice是有一定默认空间的(尤其是map),如果不用append,直接a[x]=n来增加值,会不会越界抛出异常。。...阅读全文

博文 2016-06-13 14:00:02 hificamera

双线虚拟主机为何那么火?优势在哪?

在说优势之前先简单科普一下什么是双线虚拟主机,双线虚拟主机又称为智能双线虚拟主机和智能双线网站空间,它能解决国内南北方电信和网通用户互联互通的问题特推出的智能双线虚拟主机服务。 从分类上看双线虚拟主机包括单IP地址单网卡、双IP地址单网卡和双IP地址双网卡等三种类型。其中单网卡双IP和双网卡双IP两种都有一个电信IP地址和一个网通IP地址。电信用户访问电信IP地址,网通用户访问网通IP地址,这样才能实现电信网通快速访问。 我们都知道南电信、北联通,国内线路分为电信和联通。在线路的访问上,电信用户、联通用户互访速度都比较快,而两大运营商之间互相访问则速度会比较慢。如果你的主机只有一条线路,那么网站就有可能因为线路的问题,在国内有的地区打开速度可能会很慢。访问过来的用户会以为是网站的...阅读全文

清华校园网远程

简述 清华校园网采用dhcp动态地址,因此每个同学的ip地址都会变化,并且一般自己的账号连上去以后只能保留6个小时大概,有时校园网还会抽风,对于我等渴望在宿舍科研的人不得不说是一个巨大的障碍。因此只要实现了网络自动登陆的问题,就而可以实现了。 循环登陆检测 关于清华校园网的自动登陆github上已经有了很多,然而这里还是要区分一下的,因为学校校园网已经由net时代慢慢向auth4时代过渡了。auth4与net不同的地方在于多了一个是否访问校外网络的功能。目前github上还留有很多net的代码。 我个人的代码在https://github.com/yushuaizhao/gotunet/,有windows的编译https://github.com/yushuaizhao/gotunet/re...阅读全文

博文 2019-04-19 11:34:46 zhaoyd

深入理解 Go map:赋值和扩容迁移

概要 在 上一章节 中,数据结构小节里讲解了大量基础字段,可能你会疑惑需要 #&(!……#(!¥! 来干嘛?接下来我们一起简单了解一下基础概念。再开始研讨今天文章的重点内容。我相信这样你能更好的读懂这篇文章 原文地址:深入理解 Go map:赋值和扩容迁移 哈希函数 哈希函数,又称散列算法、散列函数。主要作用是通过特定算法将数据根据一定规则组合重新生成得到一个散列值 而在哈希表中,其生成的散列值常用于寻找其键映射到哪一个桶上。而一个好的哈希函数,应当尽量少的出现哈希冲突,以此保证操作哈希表的时间复杂度(但是哈希冲突在目前来讲,是无法避免的。我们需要 “解决” 它) 链地址法 在哈希操作中,相当核心的一个处理动作就是 “哈希冲突” 的解决。而在 Go map 中采用的就是 "链地址法 " 去解...阅读全文

博文 2019-03-24 21:34:40 煎鱼

世界上最简单的监控服务 pingd

pingd 是世界上最简单的监控服务,使用 golang 编写。软件支持 IPv6,但是服务器不支持。 pingd 允许同时 ping 上千个 IPs,在此期间还可以管理监控的主机。 用户提供主机名或者 IP,还有用户邮箱地址,就可以使用 3 个生成 URLs 来开启,停止或者删除你的追踪。每当你的服务器停机或者后台在线都会发送通知,还包含控制 URLs。

~$# start monitoring your server with a single curl command.
~$curl ping.gg/me@example.org/104.28.13.51
[ ok...阅读全文

不用go-(xxoo)agent的也有可能是程序员

记得是去年某个时候,在一个群里问大家是怎么翻(什么)墙的,发现很多人是用go-(xxoo)agent的,而我当时完全没听说过go-agent,因为我已经N多年不翻(什么)墙了,于是,有人就说:“连go-(xxoo)agent都没用过你还是程序员吗?”说实话,我也不希望我是程序员啊!可我真的没用过go-(xxoo)agent啊! 想起我一位前同事,工作很多年了,却从来没用过linux!(也不知道他说的是真的还是假的,至于你信不信,反正我是信了。)他说这是他第一次用linux!(也难怪啊,他在原来的公司干里好多年,公司是用.net的。自然没必要用linux。)但我不能说他不是程序员,事实上,他工作完成得很出色。i第一次接触linux,很快就熟悉了。 不用linux还可以用windows,不用go...阅读全文

一个golang 实现tcp服务例子

package main import ( "fmt" "net" "time" "os" "os/signal" "sync" ) const ( WorkerCount = 2 ) type Task struct { Id int32 Message string } var wg sync.WaitGroup var taskChannel = make(chan Task) var signChannel = make(chan os.Signal, 1) var exitChanel = make(chan int) func main() { go installSign() tcpAddr, err := net.ResolveTCPAddr("tcp4", "127.0.0...阅读全文

博文 2018-01-31 15:33:03 何吕

google hosts 2015 最新版本

chromr浏览器注意:在地址栏里输入 "chrome://flags/",然后查找QUIC,启用该协议,同时建议启用 "SPDY/4",能让访问更流畅。 #google hosts 2015#更新时间:2015年1月13日#持续更新地址:http://www.cnblogs.com/echoyy/ #base services 64.233.168.87 google.com 64.233.168.87 www.google.com 64.233.168.87 m.google.com 64.233.168.87 scholar.google.com 64.233.168.87 translate.google.com 64.233.168.87 books.google.com 64.2...阅读全文

博文 2015-01-16 18:00:01 echoyy

指针与引用

点击上方蓝色“Golang来啦”关注我哟加个“星标”,天天 15 分钟,一起学 Go『就要学习 Go 语言』系列 -- 第 27 篇分享好文前几天,有同学在技术交流群里问:指针与引用的区别?在群里没做太多解释,回去找了篇 Steve Francia 大神关于「指针与引用」的文章,翻译过来了,可以点击文末的「阅读原文」查看原版。包括 C、C++ 在内的一些语言支持指针。其他语言包括 C++、Java、Python、Ruby、Perl 和 PHP 都支持引用。从表面上看,引用和指针非常相似,它们都用来让一个变量提供对另一个变量的访问。由于两者都提供了许多相同的功能,所以常常不清楚它们各自的内部机制有什么不同。在本文中,我将说明指针和引用之间的区别。为什么这很重要指针是 Go 语言的核心。大多数程...阅读全文

博文 2019-08-31 21:13:12 Golang来啦

《Go语言四十二章经》第三十三章 Socket网络

《Go语言四十二章经》第三十三章 Socket网络 作者:李骁 ## 33.1 Socket基础知识 tcp/udp、ip构成了网络通信的基石,tcp/ip是面向连接的通信协议,要求建立连接时进行3次握手确保连接已被建立,关闭连接时需要4次通信来保证客户端和服务端都已经关闭,也就是我们常说的三次握手,四次挥手。在通信过程中还有保证数据不丢失,在连接不畅通时还需要进行超时重试等等。 socket就是封装了这一套基于tcp/udp/ip协议细节,提供了一系列套接字接口进行通信。 我们知道Socket有两种:TCP Socket和UDP Socket,TCP和UDP是协议,而要确定一个进程的需要三元组,还需要IP地址和端口。 * IPv4地址 目前的全球因特网所采用的协议族是TCP/IP协议。IP...阅读全文

博文 2018-10-13 20:28:32 roteman

Golang 1.3 sync.Atomic源码解析

上一篇文章我们说到sync.Mutex的源码实现,核心就是使用到了CPU指令CAS,从并发性能上来说atomic的效率是要高于mutex的,毕竟mutex做了不少的其他步骤,而atomic的核心其实就是和处理器密切关系的,通过一两个指令就能完成的原子操作,我们接下来来看看atomic在golang中的一些细节。 通过目录: 64bit_arm.go asm_amd64p32.s asm_linux_arm.s atomic_test.go race.go asm_386.s asm_arm.s asm_netbsd_arm.s doc.go asm_amd64.s asm_freebsd_arm.s atomic_linux_arm_test.go export_linux_arm_test...阅读全文

博文 2014-10-19 09:03:49 毛, 剑