golang

Atitit.go语言golang语言的新的特性  attilax总结

可紊 提交于 2019-12-10 04:54:05
Atitit.go 语言 golang 语言的新的特性 attilax 总结 1 . 继承树 less 动态接口 1 1 .1. 按照书中说的,Go语言具有以下的特征,下面我们分别来进行介绍。 q 自动 垃圾回收 q 2 1 .2. 更丰富的内置类型 2 1 .3. . 更丰富的内置类型 2 1 .4. 错误处理 defer 3 1 .5. 匿名函数和闭包 q 3 1 .6. 类型和接口 非侵入型”接口的概念。 3 1 .7. q 并发 编程 4 1 .8. q 反射 4 1 .9. q 语言交互性 4 1 .10. 函数多返回值 > func getName()(firstName, middleName, lastName, nickName string){ > return "May" , "M" , "Chen" , "Babe" } //定义了一个多返回值的 函数 getName > > fn , mn , ln , nn := getName ( ) //调用赋值 > _ , _ , lastName, _ := getName() //缺省调用 5 2 . 参考 5 1. 继承树 less 动态接口 编程语言作为工具和其他所有工具的目的是一样的,就是为了提高生产力。Go语言也不例外,Go语言也有GC、也支持Erlang式的轻量级并发

golang seelog使用

好久不见. 提交于 2019-12-10 01:43:44
golang中自带的有log包,但是功能并不能满足我们。很多人推荐seelog,我们今天一起学习下。 安装 go get github.com/cihub/seelog 快速开始 引用seelog wiki上的代码 123456 package mainimport log "github.com/cihub/seelog"func () { defer log.Flush() log.Info("Hello from Seelog!")} 这样就能在控制面板打印了,但是它是那么的丑陋!这里Info方法代表的是日志的级别,常用的有Trace, Debug, Info, Warn, Error, Critical 方法。 我们一般都会自定义格式等,seelog为我们提供了xml和代码两种方式来配置。 先看最简单的xml配置使用方法 12345 <seelog> <outputs> <console /> </outputs></seelog> 在代码中读取配置文档 1234567 logger, err := seelog.LoggerFromConfigAsFile("./config/seelog.xml")if err != nil { log.Fatal(err)}seelog.ReplaceLogger(logger)defer seelog.Flush()seelog

golang sync.WaitGroup解决goroutine同步

北慕城南 提交于 2019-12-10 01:41:35
go提供了sync包和channel来解决协程同步和通讯 。新手对channel通道操作起来更容易产生 死锁 ,如果时缓冲的channel还要考虑channel放入和取出数据的速率问题。 从字面就可以理解,sync.WaitGroup是等待一组协程结束。它实现了一个类似任务队列的结构,你可以向队列中加入任务,任务完成后就把任务从队列中移除,如果队列中的任务没有全部完成,队列就会触发阻塞以阻止程序继续运行。 sync.WaitGroup只有3个方法,Add(),Done(),Wait() 。 其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。 简单示例如下: package main import ( "fmt" "sync" ) var waitgroup sync.WaitGroup func test(shownum int) { fmt.Println(shownum) waitgroup.Done() //任务完成,将任务队列中的任务数量-1,其实.Done就是.Add(-1) } func main() { for i := 0; i < 10; i++ { waitgroup.Add(1) //每创建一个goroutine,就把任务队列中任务的数量+1 go test(i) }

golang 进程间共享内存

自作多情 提交于 2019-12-10 01:36:58
最近想认真学习一下golang, 最好的学习方法当然是做一个项目咯.。这个项目服务端用GO编写,前端打算用VUE来搞。项目的功能呢,大致就是go能定期通过爬虫获取一些网络数据, 然后通过http接口vue展示数据。 一开始,想要解决的问题是,想通过共享内存的方式进行各子进程间的通信,因为这种方式最快。因为之前C++有用过 CreateFileMapping和 OpenFileMapping,所以也研究了一下GO有没有相关的库。发现有个syscall库有一些系统调用相关函数,syscall库的相关介绍如下: Go 语言库对Syscall的封装 我们知道Go是一门面向系统级开发的Native编程语言,与C/C++ 类似,Go的编译器会直接将程序编译、链接成本地可执行文件。理论上,它可以完成任何C/C++语言能完成的。作为支撑该特性的重要方面,Go以标准库形式提供了syscall包,用来支持OS级系统调用。 首先,Go对各种系统调用接口进行了封装,提供给用户一组Go语言函数,方便在程序中直接调用,如: func Read(fd int, p []byte) (n int, err error) func Write(fd int, p []byte) (n int, err error) 同时,Go还通过以下函数提供了对Syscall的直接调用支持: func Syscall(trap,

学习golang的历程——持续更新

假装没事ソ 提交于 2019-12-10 00:38:03
学习一门语言首先hello world 1,首先建立一个目录,新建一个hello.go的文件 package main import ( "fmt" ) func main() { fmt.Println("hello world") } 2,go run hello.go jack_zhou@zhoulideMacBook-Pro study % go run hello.go hello world 上面我们就完成了我们的基础使命。下面我们正式开始入门 在正式进入写代码之前,推荐大家使用JB家族的Goland 在设置中需要注意GOPATH和GOROOT不能写同一个地址,否则会报错: warning: GOPATH set to GOROOT (/usr/local/go) has no effect 一, 入门篇 1,golang语言特性 ① 垃圾回收 内存自动回收,不需要开发人员管理内存 开发人员只需关注业务实现,降低负担 只需new分配内存,不需要释放 ② 天然并发 从语言层面支持并发,非常简单 goroute,轻量级线程,创建成千上万个goroute成为可能 基于CSP(Communicating Sequential Process)模型实现 ③ 管道(channel) 管道,类似unix/linux中的pipe 多个goroute之间通过channel进行通信

golang和java的http性能对比

两盒软妹~` 提交于 2019-12-10 00:01:11
公司要重构一个统计项目,统计部分要提供一个web收数的接口,因为统计系统的日志量十分大,所以对web服务的性能要求很严格,在技术选择的背景下做了golang和java的性能对比. 测试环境: mac pro 13.4.0 golang: go version go1.3.1 darwin/amd64 java: 1.7.0_71, 基于tomcat容器 测试工具 apache Ab工具: http://httpd.apache.org/docs/2.2/programs/ab.html 测试流程 golang使用源生的net/http服务搭建http项目,接口输出hello world java使用servlet 搭建web项目,接口同样输出hello world ab工具使用 ab -c 100 -n 1000 http://127.0.0.1/track_proxy 表示模拟100个客户端并发发送共1000个请求 测试结果 GOMAXPROCS=1(括号内为GOMAXPROCS=4 ) 从测试结果来看, GOMAXPROCS = 1时, golang的http性能比java略微有一些优势, GOMAXPROCS = 4时,golang的http性能稍微有所提升, 总体来说golang表现胜出, 所以,还是用go吧~~ 来源: oschina 链接: https://my

深入分析golang多值返回以及闭包的实现

天涯浪子 提交于 2019-12-09 22:10:20
一、前言 golang有很多新颖的特性,不知道大家的使用的时候,有没想过,这些特性是如何实现的?当然你可能会说,不了解这些特性好像也不影响自己使用golang,你说的也有道理,但是,多了解底层的实现原理,对于在使用golang时的眼界是完全不一样的,就类似于看过http的实现之后,再来使用http框架,和未看过http框架时的眼界是不一样的,当然,你如果是一名it爱好者,求知欲自然会引导你去学习。 二、这篇文章主要就分析两点: 1、golang多值返回的实现; 2、golang闭包的实现; 三、golang多值返回的实现 我们在学C/C++时,很多人应该有了解过C/C++函数调用过程,参数是通过寄存器di和si(假设就两个参数)传递给被调用的函数,被调用函数的返回结果只能是通过eax寄存器返回给调用函数,因此C/C++函数只能返回一个值,那么我们是不是可以想象,golang的多值返回是否可以通过多个寄存器来实现的,正如用多个寄存器来传参一样? 这也是一种办法,但是golang并没有采用;我的理解是引入多个寄存器来存储返回值,会引起多个寄存器用途的重新约定,这无疑增加了复杂度;可以这么说,golang的ABI与C/C++非常不一样; 在从汇编角度分析golang多值返回之前,需要先熟悉golang汇编代码的一些约定, golang官网 有说明,这里重点说明四个symbols

golang数据结构之循环链表

末鹿安然 提交于 2019-12-09 19:42:09
循环链表还是挺有难度的: 向链表中插入第一条数据的时候如何进行初始化。 删除循环链表中的数据时要考虑多种情况。 详情在代码中一一说明。 目录结构如下: circleLink.go package link import ( "fmt" ) type CatNode struct { ID int Name string next *CatNode } func InserCatNode(head *CatNode, newCatNode *CatNode) { //初始化链表 //头结点一开始是空的,当插入第一条数据时,进行初始化 if head.next == nil { head.ID = newCatNode.ID head.Name = newCatNode.Name head.next = head return } //定义一个临时变量,找到环形的末尾,方便以后进行插入 tmp := head for { if tmp.next == head { tmp.next = newCatNode newCatNode.next = head break } else { tmp = tmp.next } } } func DeleteCatNode(head *CatNode, id int) *CatNode { //建立一个节点指向头结点 tmp := head /

leetcode 最大子序列 golang实现

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-09 15:54:50
描述 给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。 思路 遍历每一个数字nums[i] ans 表示遍历数字中的最大值 sum表示i 之前的序列和 如果sum < 0 则sum 对当前数字没有增益 舍弃sum 让sum= nus[i] 如果sum > 0 则sum= sum + nums[i] 最后判断 ans = max(ans, sum) 实现 func maxSubArray ( nums [ ] int ) int { var sum = nums [ 0 ] var ans = nums [ 0 ] for i := 1 ; i < len ( nums ) ; i ++ { if sum < 0 { sum = nums [ i ] } else { sum += nums [ i ] } ans = Max ( ans , sum ) } return ans } 来源: CSDN 作者: tzh_linux 链接: https://blog.csdn.net/tzh_linux/article/details/103458682

lighttpd 集成 golang

爷,独闯天下 提交于 2019-12-09 15:47:41
#lighttpd 集成 golang Author: nullchen Email: 526624974@qq.com ##简介: 我们业务用fastcgi做接入,抽空研究了下fcgi如何运行在httpserver之上,主要是fcgi与httpserver的通信,在这里简单的记录一下。由于qzhttp是非开源的,这里以lighttpd位对象,进行学习。本文分两部分,第一部分简单的分析lighttpd如何与fastcgi应用通信,在此基础上,第二部分位了对第一部分的结论进行验证,简单的将golang用fastcgi的方式集成到lighttpd中,让lighttpd管理golang进程,从而实现 多进程+多线程+多协程 的模式。 ##第一部分 为了描述清楚,我们首先按照功能进行角色划分如下: fastcgi client: fastcgi client的功能主要是将收到的http请求转换成fastcgi请求发送给fastcgiserver,收到应答后转换成http格式的应答并发送给http请求者。lighttpd具有fastcgi client的功能。 fastcgi server: fastcgi server的主要功能主要是进行进程的管理。并在各个进程中执行fastcgi application。从而使fastcgi application专注于业务逻辑