golang

golang 创建 tun 设备

為{幸葍}努か 提交于 2019-12-02 19:34:21
源码: package main import ( "flag" "fmt" "github.com/pkg/errors" "net" "os" "syscall" "unsafe" ) var ( HostName, _ = os.Hostname() ETH_P_ARP = 0x0806 AF_INET = int32(2) AF_INET6 = int32(10) AF_BRIDGE = int32(7) ) func Htons(i uint16) uint16 { return (i<<8)&0xff00 | i>>8 } type intfReq struct { name [16]byte flags uint16 } // sendIOCtlMessage ioctl system call func sendIOCtlMessage(fd uintptr, request uintptr, ifReq uintptr) error { fmt.Printf("syscall fd %+v, request %+v, ifReq %+v", fd, request, ifReq) _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, fd, request, ifReq) if errno != 0 { fmt

golang 交叉编译,跨平台

a 夏天 提交于 2019-12-02 19:29:09
因为我的本地开发环境是os x 但服务器是linux,所以需要编译linux用的go程序,方法如下: ###各平台的GOOS和GOARCH参考 OS ARCH OS version linux 386 / amd64 / arm >= Linux 2.6 darwin 386 / amd64 OS X (Snow Leopard + Lion) freebsd 386 / amd64 >= FreeBSD 7 windows 386 / amd64 >= Windows 2000 $ cd /usr/local/go/src $ sudo CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash 这里并不是重新编译Go,因为安装Go的时候,只是编译了本地系统需要的东西;而需要跨平台交叉编译,需要在Go中增加对其他平台的支持。所以,有 ./make.bash 这么一个过程。 执行结果类似如下: sudo CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash Password: ###Building C bootstrap tool. cmd/dist ###Building compilers and Go bootstrap tool for host, darwin/amd64. lib9

安装golang及设置环境变量,安装goland开发环境

北战南征 提交于 2019-12-02 19:07:39
go的开发文档    https://studygolang.com/    https://studygolang.com/pkgdoc 安装   下载      https://studygolang.com/dl   安装     一路next   配置环境变量     GOROOT:go的安装路径     GOPATH:go的工程路径      GOPATH下主要包含三个目录        bin:可执行文件        pkg:编译好的库文件.a        src:源文件.go   查看是否配置成功     go env 查看go的配置信息     go version 查看版本号 mac 下安装与配置   双击下载好的pkg 配置环境变量   cd ~     进入主目录   ls -all     查看是否存在.bash_profile   存在     使用vim .bash_profile打开编辑       输入 i 进入编辑模式         加上如下代码           export GOPATH=/Users/linanxing/Documents/go_test           export GOROOT=/Usr/local/go           export GOBIN=$GOROOT/bin           export

golang(一)

落花浮王杯 提交于 2019-12-02 18:16:46
开篇先来个Go语言的吉祥物- 金花鼠 Gordon。 golang 是谷歌2009年发布的开源编程语言,截止目前go的release版本已经到了1.10。go语言的开发人员都是计算机界大神一般的存在: Thompson:1983年图灵奖(Turing Award)和1998年美国国家技术奖(National Medal of Technology)得主。他与Dennis Ritchie是Unix的原创者。Thompson也发明了后来衍生出C语言的B程序语言。 Pike:曾是贝尔实验室(Bell Labs)的Unix团队,和Plan 9操作系统计划的成员。他与Thompson共事多年,并共创出广泛使用的UTF-8字元编码。 Robert Griesemer:曾协助制作Java的HotSpot编译器,和Chrome浏览器的JavaScript引擎V8。 Russ Cox:Plan 9开发者 Ian Taylor:曾改善已广泛使用之开源码编译器GCC 主要的开发者 : 肯.汤姆逊(Ken Thompson):图灵奖得主,Uinx发明人,B语言作者(C语言前身),还做飞行员,后来被谷歌挖走。 罗布.派克(Rob Pike):Unix团队和Plan 9操作系统计划的成员,与Ken老爷子共事多年,并共创出广泛使用的UTF-8 字元编码。 罗伯特.格里泽默(Robert Griesemer)

Golang 函数耗时统计

痞子三分冷 提交于 2019-12-02 18:14:32
当时候需要去计算一段代码或一个程序所消耗时间的时候,就需要进行统计时间,用程序去计算某一段代码的执行所需要的时间远比用眼睛直接去看程序运行时间高很多。 go语言中的time包中提供了函数来提供计算消耗时间,具体的使用方式如下案例所示: bT := time.Now() // 开始时间 eT := time.Since(bT) // 从开始到当前所消耗的时间 fmt.Println("Run time: ", eT) 1.朴素方法 在函数起始位置计算当前时间,在函数结束位置算出耗时。 package main import ( "fmt" "time" ) func sum(n int) int { startT := time.Now() //计算当前时间 total := 0 for i:=1; i <= n; i++ { total += i } tc := time.Since(startT) //计算耗时 fmt.Printf("time cost = %v\n", tc) return total } func main() { count := sum(100) fmt.Printf("count = %v\n", count) } 编译运行输出: time cost = 350ns count = 5050 2.简洁方法 计算当前时间与计算耗时放在两处,难免显得丑陋

golang思考之多核并行

允我心安 提交于 2019-12-02 18:02:13
有些资料显示golang实现了并发,离多核并行还有很远。学习吧测试发现golang实现了多核并行。 package main import "fmt" func main() { for i := 0; i < 10; i++ { var sum int64 = 0 var j int64 for j = 0; j < 1000000000; j++ { sum += j } fmt.Println("sum:", sum) } } 运行时间:6.254s。 多核并行: package main import ( "fmt" "runtime" ) func main() { runtime.GOMAXPROCS(4) ch := make(chan int64, 10) for i := 0; i < 10; i++ { go func() { var sum int64 = 0 var j int64 for j = 0; j < 1000000000; j++ { sum += j } ch <- sum }() } for i := 0; i < 10; i++ { fmt.Println("sum:", <-ch) } } 运行时间:2.057s。系统监视器显示4个核都运行到了100%。 来源: oschina 链接: https://my.oschina.net/u

golang 常用系统处理函数

孤街醉人 提交于 2019-12-02 17:09:09
1. 统计字符串长度,按字节 len(str) 2. 字符串遍历,同时处理有中文的问题 r := []rune(str) 3. 字符串转整数:n, err := strconv.Atoi("1234") 4. 整数转字符串 str = strconv.Itoa(12345) 5. 字符串转 []byte:  var bytes = []byte("hello go") 6. []byte 转字符串:   str = string([]byte{97, 98, 99}) 7.10进制转2,8,16进制:str=strconv.FormatInt(123, 进制的阿拉伯数字) 8. 查找子串是否在制定的字符串中: strings.Contains("seafood", "foo")   //true 9. 统计一个字符串有几个指定的子串: strings.Count("ceheese", "e")  // 4 10. 不区分大小写的字符串比较(== 是区分大小写的): strings.EqualFold("abc", "Abc")  //true 11. 返回字符串第一次出现的index值, 如果没有返回-1: strings.Index("go golang", "go")   //0 12. 返回子串在字符串最后一次出现的index,如果没有返回-1: strings

golang 百万级请求

∥☆過路亽.° 提交于 2019-12-02 16:45:46
我在不同公司从事反爬虫、反病毒、反恶意程序已经有15年了,我知道,由于每天需要处理和应对的大量数据,这些系统最终会因此变得十分复杂。 目前我是 smsjunk.com 的CEO以及 KnowBe4 的首席架构师,两家公司都是活跃与网络安全行业。 有趣的是在过去10年作为一名软件工程师,几乎所有我参与的后端开发项目里面都是用Ruby on Rails来完成的。可是你不要误会,我热爱Ruby on Rails并且我认为它是一个非常出色的开发环境,但当你用ruby的思路在设计和开发系统一段时间以后,你往往会忘记,其实你还可以利用多线程,并行化,高速执行以及更小的内存开销来开发系统。我是一名c/c++,Delphi以及c#的开发人员已经很多年了,然后我开始慢慢意识到,使用合适的工具让系统变得更加简单明了才是一件正确的事情。 编程界对于编程语言以及框架的争论从未停歇,而我并不想参与到其中去。我相信效率高低,生产力大小以及代码的可维护性很大一部分取决于你所设计的架构是否足够简单。 要解决的问题 当我们开发一个匿名遥测以及数据分析系统的时候,其中一个需求是能够处理和应付百万数量级的POST请求,网络请求处理器会接收一个POST过来JSON,这个JSON里面会包含许多需要写入到Amazon S3的数据集合,以便我们的map-reduce系统可以在后续来处理这些数据。

golang-错误处理

馋奶兔 提交于 2019-12-02 16:36:31
1.错误处理   如果要写出健壮 ,易维护的代码 ,错误处理就是关键 ,考虑到可能会发生的意外对其进行处理   go的错误处理与众不同 ,在调用可能出现问题的方法和函数时都会返回一个类型为error的值 ,由 调用者去决定如何处理错误   错误是一个值类型error ,零值为nil 2.接受错误类型   可能文件资源不存在 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 ) 7 8 func main() { 9 text,err := ioutil.ReadFile("fuben.go") 10 if err == nil { 11 fmt.Println(err) 12 } 13 fmt.Printf("%s",text) 14 } View Code 3.创建错误   errors.New("提示") 1 package main 2 3 import ( 4 "errors" 5 "fmt" 6 ) 7 8 func main() { 9 err := errors.New("出现错误") 10 if err != nil { 11 fmt.Println(err) 12 } 13 } View Code   fmt.Errof()          #格式化创建错误 1 package main 2 3 import

golang-字符串

蓝咒 提交于 2019-12-02 16:33:29
1.字面量   字面量是没经过标识符封装看到的量 ,是内存中值的初始状态   var x string    #x是变量   x := "1"      #x是变量 ,"1"是字面量 (肉眼所见)   const x int = 10   #x是常量 ,10是字面量 2.创建字符串字面量   解释性字符串字面量双引号中写入 ,转义符可以使用 ,常见的\t \n   原始字符串使用反撇号写入 ,任何字符都是字符串 3.字符串拼接   使用缓冲区类型拼接变量效率高 ,更多操作看bytes包 1 package main 2 3 import ( 4 "bytes" 5 "fmt" 6 ) 7 8 func main() { 9 //字符串使用加号拼接效率低 10 temp := "" 11 for i:=0;i<100;i++{ 12 temp += "Zz" 13 } 14 fmt.Println(temp) 15 //使用缓冲区拼接性能提升 16 var cache bytes.Buffer //声明缓冲区 17 for i:=0;i<100;i++{ 18 cache.WriteString("Zz") //写入字符串类型 19 } 20 fmt.Println(cache.String()) //读出字符串类型 21 22 } View Code 4.字符串访问