golang

golang之网络开发

别等时光非礼了梦想. 提交于 2019-11-26 10:57:33
/*--> */ /*--> */ TCP Server/Client 开发 net 包提供 network I/O 开发接口,包括 TCP/IP 、 UDP 、 DNS 和 Unix domain sockets 。 常用开发一般仅需要最基础接口或函数: 服务器: net.Listen() , net.Accept() ln, err := net.Listen("tcp", ":8080") if err != nil { // handle error } for { conn, err := ln.Accept() if err != nil { // handle error } go handleConnection(conn) } 客户端: net.Dial() conn, err := net.Dial("tcp", "golang.org:80") if err != nil { // handle error } fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n") status, err := bufio.NewReader(conn).ReadString('\n') // ... 相关 API 定义: func Listen(network, address string) (Listener, error) func

golang命名返回值函数与未命名返回值函数介绍

ぐ巨炮叔叔 提交于 2019-11-26 08:35:26
golang命名返回值函数与未命名返回值函数介绍 1、golang函数返回值可在定义时给出变量名称 //未命名返回值函数 func test1 ( num int ) int { return num + 1 } //命名返回值函数 func test2 ( num int ) ( res int ) { res = num + 1 return res } 2、命名返回值函数在return时,可不写返回变量名 //命名返回值函数 func test2 ( num int ) ( res int ) { res = num + 1 return //可不写返回变量名,但return是必须的 } 3、命名返回值函数在return时,可重新指定返回值 func test2 ( num int ) ( res int ) { res = num + 1 return //可不写返回变量名,但return是必须的 } func test3 ( num int ) ( res int ) { res = num + 1 return num //重新指定返回值 } func main ( ) { fmt . Println ( "输出结果是:" , test2 ( 1 ) ) fmt . Println ( "输出结果是:" , test3 ( 1 ) ) } 输出结果是: 2 输出结果是:

golang网络编程高并发

心不动则不痛 提交于 2019-11-26 05:38:24
1 golang写服务器不需要epoll吗 golang写服务器不需要在用reactor模式的epoll了,因为golang的协程非常廉价,可以并发开启成千上完个协程。 一个协程占用内存大概2KB左右,一个线程占用内存大概2MB左右,一个线程抵1000个协程。 所以,用golang写服务器程序会简单很多。 来源: https://www.cnblogs.com/hustdc/p/11316440.html

Golang sync.Pool 简介与用法

我与影子孤独终老i 提交于 2019-11-26 03:44:35
Pool 是可伸缩、并发安全的临时对象池,用来存放已经分配但暂时不用的临时对象,通过对象重用机制,缓解 GC 压力,提高程序性能。 一个比较好的例子是 fmt 包,fmt 包总是需要使用一些 []byte 之类的对象,Golang 建立了一个临时对象池,存放着这些对象,如果需要使用一个 []byte,就去 Pool 中取,如果拿不到就分配一个。这比起不停生成新的[]byte,用完了再等待 GC 回收要高效得多。 注意,sync.Pool 是一个临时的对象池,适用于储存一些会在 goroutine 间共享的临时对象,其中保存的任何项都可能随时不做通知地释放掉,所以不适合用于存放诸如 socket 长连接或数据库连接的对象。 type Pool struct { // New optionally specifies a function to generate // a value when Get would otherwise return nil. // It may not be changed concurrently with calls to Get. New func() interface{} // contains filtered or unexported fields } //从 Pool 中获取元素,元素数量 -1,当 Pool 中没有元素时,会调用

golang中sort包用法

Deadly 提交于 2019-11-26 03:44:26
golang中也实现了排序算法的包sort包. sort包中实现了3种基本的排序算法:插入排序.快排和堆排序.和其他语言中一样,这三种方式都是不公开的,他们只在sort包内部使用.所以用户在使用sort包进行排序时无需考虑使用那种排序方式,sort.Interface定义的三个方法:获取数据集合长度的Len()方法、比较两个元素大小的Less()方法和交换两个元素位置的Swap()方法,就可以顺利对数据集合进行排序。 sort包会根据实际数据自动选择高效的排序算法 。 type Interface type Interface interface { Len() int // Len 为集合内元素的总数 Less(i, j int ) bool  //如果index为i的元素小于index为j的元素,则返回true,否则返回false Swap(i, j int ) // Swap 交换索引为 i 和 j 的元素 } 任何实现了 sort.Interface 的类型(一般为集合),均可使用该包中的方法进行排序。这些方法要求集合内列出元素的索引为整数。 func Float64s(a []float64) //Float64s将类型为float64的slice a以升序方式进行排序 func Float64sAreSorted(a []float64) bool  /

golang之flag.string使用 os.Args

半腔热情 提交于 2019-11-26 03:43:48
有时候我们的程序启动时会需要带一些参数,这个时候怎么golang自带的flag.string来解析参数 参数 功能 name 命令行参数名称,比如 -b, -help value 默认值,未显式指定的参数,给出隐式的默认值,比如本例中-b未给出的话,*b=false usage 提示信息,如果给出的参数不正确或者需要查看帮助 -help,那么会给出这里指定的字符串 参考地址:https://blog.csdn.net/guanchunsheng/article/details/79612153 flag使用前,必须首先解析: flag .Parse () func main() { dir := flag.String( " b " , " /home/default_dir " , " backup path " ) mode := flag.Bool( " d " , false , " debug mode " ) flag.Parse() fmt.Println( " dir: " , * dir) fmt.Println( " mode: " , * mode) } package main import ( "os" "fmt" ) func main ( ) { if len ( os . Args ) != 0 { fmt . Println ( os . Args

Golang之缓冲器bytes.Buffer

岁酱吖の 提交于 2019-11-26 03:43:37
声明一个Buffer的四种方法: var b bytes.Buffer // 直接定义一个Buffer变量,不用初始化,可以直接使用 b := new(bytes.Buffer) //使用New返回Buffer变量 b := bytes.NewBuffer(s []byte) //从一个[]byte切片,构造一个Buffer b := bytes.NewBufferString(s string) //从一个string变量,构造一个Buffer 往Buffer中写入数据 b.Write(d []byte) //将切片d写入Buffer尾部 b.WriteString(s string) //将字符串s写入Buffer尾部 b.WriteByte(c byte) //将字符c写入Buffer尾部 b.WriteRune(r rune) //将一个rune类型的数据放到缓冲器的尾部 b.WriteTo( w io.Writer ) //将Buffer中的内容输出到实现了io.Writer接口的可写入对象中 注:将文件中的内容写入Buffer,则使用ReadForm(i io.Reader) 从Buffer中读取数据到指定容器 c := make([]byte,8) b.Read(c) //一次读取8个byte到c容器中,每次读取新的8个byte覆盖c中原来的内容 b.ReadByte

golang 中 reflect 简单用法

限于喜欢 提交于 2019-11-26 03:43:25
package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func (p Person) GetName() string { return p.Name } func (p Person) SetName(s string) { p.Name = s } func main() { a := &Person{"Name", 1} t := reflect.TypeOf(*a) //必须取值,否则类型为空 fmt.Println(t.Name()) v := reflect.ValueOf(a).Elem() //a需要是引用 k := v.Type() for i := 0; i < v.NumField(); i++ { key := k.Field(i) val := v.Field(i) fmt.Println(key.Name, val.Type(), val.Interface()) } for i := 0; i < v.NumMethod(); i++ { key := k.Method(i) val := v.Method(i) fmt.Println(key.Name, val.Type(), val.Interface()) } v

golang 报错 undefined: proto.InternalMessageInfo

五迷三道 提交于 2019-11-26 03:43:12
问题原因: 新的版本加入了InternalMessageInfo导致编译不过 解决方法: 1、使用旧版本的插件,即手动下载并安装protoc-gen-go版本v1.1.0 (https://github.com/golang/protobuf/releases/tag/v1.0.0)来生成旧风格的原型代码。 方法:tar zxvf protobuf-1.0.0.tar.gz cd protobuf-1.0.0/protoc-gen-go go build 将生成的protoc-gen-go放入$GOROOT/bin目录下,重新编译protobuf文件 protoc xxx.proto --go_out=. 重新编译项目,问题解决 2、使用正确的依赖版本:您的项目依赖项中应该有github.com/golang/protobuf 目录, 将其替换为最新版本(v1.2.0),下载地址: https://github.com/golang/protobuf/releases, 即将下载的目录替换项目中的github.com/golang/protobuf目录,问题解决。 经测试2种方法都可行。 来源: CSDN 作者: ferghs 链接: https://blog.csdn.net/busai2/article/details/82805788

Golang sync.Map 简介与用法

↘锁芯ラ 提交于 2019-11-26 03:42:37
Golang 中的 map 在并发情况下,只读是线程安全的,并发读写线程不安全。为了解决这个问题,Golang 提供了语言层级的并发读写安全的 sync.Map。 type Map struct { // contains filtered or unexported fields } //删除操作 func (m *Map) Delete(key interface{}) //读操作 func (m *Map) Load(key interface{}) (value interface{}, ok bool) //读取或写入。存在指定的 key 则读取,否则写入。actual为存在的 value 或新写入的 value,loaded 读操作返回true,写操作返回false func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) //写操作 func (m *Map) Store(key, value interface{}) //遍历 func (m *Map) Range(f func(key, value interface{}) bool) sync.Map 开箱即用,无需像 map 调用 make() 进行显示初始化。此外,sync.Map 的 key 和