golang

【备份】golang开发环境搭建

纵饮孤独 提交于 2019-12-10 18:05:35
硬盘坏了以前装的东西 装东西的时候还得现搜 所以决定写下来 以后可能用 到golang.org下载 安装包 如果被墙改host windows直接下载那个msi安装的 linux下载下来解压自己设置一下环境变量运行那个all.bash(好像是这个) 然后 在命令行运行输入go 输出帮助信息 就是安装成功了 下载sublime text2 安装sublime text 插件管理器 按CTRL+` 输入 import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation' 重启一下

golang: 常用数据类型底层结构分析

梦想的初衷 提交于 2019-12-10 17:05:05
虽然golang是用C实现的,并且被称为下一代的C语言,但是golang跟C的差别还是很大的。它定义了一套很丰富的数据类型及数据结构,这些类型和结构或者是直接映射为C的数据类型,或者是用C struct来实现。了解golang的数据类型和数据结构的底层实现,将有助于我们更好的理解golang并写出质量更好的代码。 基础类型 源码在:$GOROOT/src/pkg/runtime/runtime.h 。我们先来看下基础类型: /* * basic types */ typedef signed char int8; typedef unsigned char uint8; typedef signed short int16; typedef unsigned short uint16; typedef signed int int32; typedef unsigned int uint32; typedef signed long long int int64; typedef unsigned long long int uint64; typedef float float32; typedef double float64; #ifdef _64BIT typedef uint64 uintptr; typedef int64 intptr; typedef int64

golang数据结构之快速排序

你离开我真会死。 提交于 2019-12-10 16:42:45
具体过程:黑色标记代表左指针,红色标记代表右指针,蓝色标记代表中间值。(依次从左往向下) //QuickSort 快速排序 func QuickSort(left int, right int, arr *[7]int) { l := left r := right pivot := arr[(left+right)/2] tmp := 0 for l < r { for arr[l] < pivot { l++ } for arr[r] > pivot { r-- } if l >= r { break } tmp = arr[l] arr[l] = arr[r] arr[r] = tmp if arr[l] == pivot { r-- } if arr[r] == pivot { l++ } } if l == r { l++ r-- } if left < r { QuickSort(left, r, arr) } if right > l { QuickSort(l, right, arr) } } 来源: https://www.cnblogs.com/xiximayou/p/12017445.html

golang数据结构之选择排序

时间秒杀一切 提交于 2019-12-10 16:32:54
//SelectSort 选择排序 func SelectSort(arr *[7]int) { for i := 0; i < len(arr); i++ { tmp := arr[i] index := i for j := i + 1; j < len(arr); j++ { if (*arr)[j] < tmp { tmp = (*arr)[j] index = j } } if index != i { (*arr)[index], (*arr)[i] = (*arr)[i], (*arr)[index] } fmt.Printf("第%d次选择后的结果是:%v", i, *arr) } } 来源: https://www.cnblogs.com/xiximayou/p/12017392.html

Golang加密系列之AES

独自空忆成欢 提交于 2019-12-10 16:26:50
Golang加密系列之AES Golang加密系列之RSA 这里我们只讨论使用aes加密算法,pkcs7padding,CBC模式模式进行加密。 加密代码: func Encrypt(plantText, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) //选择加密算法 if err != nil { return nil, err } plantText = PKCS7Padding(plantText, block.BlockSize()) blockModel := cipher.NewCBCEncrypter(block, key[:block.BlockSize()]) ciphertext := make([]byte, len(plantText)) blockModel.CryptBlocks(ciphertext, plantText) return ciphertext, nil } func PKCS7Padding(ciphertext []byte, blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSize padtext := bytes.Repeat([]byte{byte(padding

golang http server源码解析

删除回忆录丶 提交于 2019-12-10 15:23:36
golang 版本:1.12.9 简单的HTTP服务器代码: package main import ( "net/http" ) type TestHandler struct { str string } func (th *TestHandler)ServeHTTP(w http.ResponseWriter, r *http.Request){ w.Write([]byte(string(th.str+",welcome"))) } func main(){ http.Handle("/", &TestHandler{"Hi,Stranger"}) http.HandleFunc("/test",func(w http.ResponseWriter,r *http.Request){ w.Write([]byte("Hi,Tester")) }) http.ListenAndServe(":8000",nil)} 在浏览器输入“http://127.0.0.1:8000”得到输出“Hi,Stranger,welcome”;输入“http://127.0.0.1:8000/test”得到输出“Hi,Tester” handler的注册 handler的相关方法如下: func NewServeMux() *ServeMux func (mux *ServeMux)

golang net http库相关超时的设置

百般思念 提交于 2019-12-10 14:14:53
net.http 包中的超时设置 服务端 app.Server.ReadTimeout app.Server.WriteTimeout 是针对所有请求设置的选项 默认 net.http keepalived 开启,超时时间为 3 分钟,如下 1942 type tcpKeepAliveListener struct { 1943 *net.TCPListener 1944 } 1945 1946 func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) { 1947 tc, err := ln.AcceptTCP() 1948 if err != nil { 1949 return 1950 } 1951 tc.SetKeepAlive(true) 1952 tc.SetKeepAlivePeriod(3 * time.Minute) 1953 return tc, nil 1954 } 没看到保活超时的配置选项,生产环境可以禁掉 针对每一连接,设置超时,可以参考 http://grokbase.com/t/gg/golang-nuts/12czccncw7/go-nuts-net-http-server-readtimeout-and-keep-alive-interaction 客户端 刚才看了下

TODO:Golang语言TCP/UDP协议重用地址端口

微笑、不失礼 提交于 2019-12-10 14:11:09
TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题。 go net包(据我所知)不允许设置套接字选项。 这在尝试进行TCP NAT时尤其成问题,其需要在同一TCP端口上进行侦听和拨号的过程。 这个包使我有可能实现这个功能。 这是一个非常小众的用例,但也许这个软件包可以随着时间的推移变得更普遍。 此包允许从同一TCP端口侦听和拨号;不能使用同一UDP端口监听,但可以监听同一UDP端口。 这意味着设置了以下sockopts: syscall.SO_REUSEADDR syscall.SO_REUSEPORT 例子: // listen on the same port. l1, _ := reuse.Listen(“tcp”, “127.0.0.1:1234”) l2, _ := reuse.Listen(“tcp”, “127.0.0.1:1234”) // dial from the same port. l1, _ := reuse.Listen(“tcp”, “127.0.0.1:1234”) l2, _ := reuse.Listen(“tcp”, “127.0.0.1:1235”) c1, _ := reuse.Dial(“tcp”, “127.0.0.1:1234”, “127.0.0.1:1235”) c2, _ :=

golang http server分析(一)

余生颓废 提交于 2019-12-10 09:29:57
golang中使用的http协议版本是 RFC2616 对于一个http服务来讲,需要兼容新旧版本的http协议,http1.0/2.0,以及https的支持,http的通信是建立在tcp连接基础上的通信。 现在协议有了,连接通信也有了,还剩一个问题就是如何处理client request请求,这个问题可以分为路由和具体逻辑实现,下面看看在golang中是如何解决这些问题的。 路由部分 在golang中有个Handler的概念,一个URL对应一个Handler,在Handler中处理request的具体逻辑,对应关系保存在一个map结构中 type ServeMux struct { mu sync.RWMutex m map[string]muxEntry //key是URL匹配字符串,muxEntry是对应的处理handler hosts bool // 路由匹配时,是否包含host } Handler分为一般类型Handler和特殊类型Handler,特殊类型Handler是指包含特定功能处理的Handler, 比如redirectHandler用来处理302跳转、NotFoundHandler用来处理404请求等。 Handler定义如下: // Handler类型定义 type Handler interface { ServeHTTP(ResponseWriter,

TODO:Golang UDP连接简单测试慎用Deadline

笑着哭i 提交于 2019-12-10 07:12:25
TODO:Golang UDP连接简单测试慎用Deadline UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 1.Golang UDP服务 package main import ( “fmt” “net” ) func sendResponse(conn *net.UDPConn, addr *net.UDPAddr) { _, err := conn.WriteToUDP([]byte(“From server: Hello I got your mesage “), addr) if err != nil { fmt.Printf(“Couldn’t send response %v”, err) } } func main() { p := make([]byte,