golang

Golang的一些缺点

老子叫甜甜 提交于 2019-12-05 00:32:38
1.右大括号不允许换行,否则编译报错;不允许包含未使用的包(设置vscode工具,保存文件时可自动修改格式) 2.不允许有未使用的变量(vscode工具无法解决) 3.错误处理原始,虽然引入了defer、panic、recover处理出错后的逻辑,函数可以返回多个值,但基本依靠返回错误是否为空来判断函数是否执行成功,if语句较多,比较繁琐,程序没有java美观。(官方解释:提供了多个返回值,处理错误方便,如加入异常机制会要求记住一些常见异常,例如IOException,go的错误Error类型较统一方便,还有panic,recover,defer机制) 4.package main的变量不能被其他package引用(有时不方便) 5.[]interface{}不支持下标操作 6.struct没有构造和析构,一些资源申请和释放动作不太方便 7.变量和函数使用大小写来区分是否对包外可见 8.仍然保留C/C++的指针操作,取地址&,取值* 9.没有泛型 (官方解释:go是服务器语言,主要特点是可扩展,可读和高并发性。加入泛型会带来run-time和类型体系复杂度提高的代价,且可用空的interface 替代,现在go越来越成熟,可以考虑在go2版本中加入泛型这些特性) 来源: CSDN 作者: ferghs 链接: https://blog.csdn.net/busai2/article

Go实战--golang中使用gRPC和Protobuf实现高性能api(golang/protobuf、google.golang.org/grpc)

跟風遠走 提交于 2019-12-05 00:32:19
生命不止,继续 go go go !!! 号外号外,插播一条广告,通过博客的uv可以看到周五,程序员是不怎么干活的: 本篇博客,使用gRPC和Protobuf,实现所谓的高性能api。 protobuf golang中的protobuf大家应该不会很陌生,之前也有博客介绍过: Go实战–go中使用google/protobuf(The way to go) Protocol Buffers (a.k.a., protobuf) are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data. You can find protobuf’s documentation on the Google Developers site. 获取: go get -u github.com/golang/protobuf/proto go get -u github.com/golang/protobuf/protoc-gen- go Protobuf语法 下面简要介绍Protobuf语法: 参考: https://segmentfault.com/a/1190000007917576 官方: https://developers.google.com

golang中gRpc的安装&goland 插件protobuf support

帅比萌擦擦* 提交于 2019-12-05 00:31:41
1、 (1)Protocol Buffers(简称protobuf)用于结构化数据和字节码之间互相转换(即实现从结构体转换为字节流以及从字节流转换为结构体),一旦你定义了自己的报文格式(message),你就可以运行ProtocolBuffer编译器,将你的.proto文件编译成特定语言的类。 (2)proto里的message,pb.go里的结构体(带方法) proto里的service,pb.go里Client API for Events service处供客户端使用的接口定义、接口实例、接口实例的初始化函数。Server API for Events service处供服务端使用的接口定义,注册函数。如果其中某一端或同时两端为流式RPC,在有流的一端,会专门为其流生成接口定义、接口实例。可以直接使用生成的实例,也可以自己实现接口,自定义实例。接口定义的主要方法就是Send和Recv。 (3)GRPC的Client与Server,均通过Netty Channel作为数据通信;序列化、反序列化则使用Protobuf,每个请求都将被封装成HTTP2的Stream,在整个生命周期中,客户端Channel应该保持长连接,而不是每次调用重新创建Channel、响应结束后关闭Channel(即短连接、交互式的RPC),目的就是达到链接的复用,进而提高交互效率。 (4)服务端用pb

golang中net包用法(一)

こ雲淡風輕ζ 提交于 2019-12-05 00:27:12
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) // 广播地址 IPv4allsys = IPv4(224, 0, 0, 1) // 所有系统,包括主机和路由器,这是一个组播地址 IPv4allrouter = IPv4(224, 0, 0, 2) // 所有组播路由器 IPv4zero = IPv4(0, 0, 0, 0) // 本地网络,只能作为本地源地址其才是合法的 ) 常用的IPV6地址: var ( IPv6zero = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} IPv6unspecified

golang中os/exec包用法

为君一笑 提交于 2019-12-05 00:26:55
exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o. func LookPath(file string) (string, error) //LookPath在环境变量中查找科执行二进制文件,如果file中包含一个斜杠,则直接根据绝对路径或者相对本目录的相对路径去查找 func main() { f, err := exec.LookPath("ls") if err != nil { fmt.Println(err) } fmt.Println(f) // /bin/ls } type Cmd   //表示一个正在准备或者正在运行的外部命令 type Cmd struct { Path string   //运行命令的路径,绝对路径或者相对路径 Args []string   // 命令参数 Env []string //进程环境,如果环境为空,则使用当前进程的环境 Dir string   //指定command的工作目录,如果dir为空,则comman在调用进程所在当前目录中运行 Stdin io.Reader  //标准输入,如果stdin是nil的话,进程从null device中读取(os.DevNull),stdin也可以时一个文件

golang中strings包用法

杀马特。学长 韩版系。学妹 提交于 2019-12-05 00:26:14
本文转自Golove博客:http://www.cnblogs.com/golove/p/3236300.html strings 包中的函数和方法 // strings.go ------------------------------------------------------------ // Count 计算字符串 sep 在 s 中的非重叠个数 // 如果 sep 为空字符串,则返回 s 中的字符(非字节)个数 + 1 // 使用 Rabin-Karp 算法实现 func Count(s, sep string) int func main() { s := "Hello,世界!!!!!" n := strings.Count(s, "!") fmt.Println(n) // 5 n = strings.Count(s, "!!") fmt.Println(n) // 2 } ------------------------------------------------------------ // Contains 判断字符串 s 中是否包含子串 substr // 如果 substr 为空,则返回 true func Contains(s, substr string) bool func main() { s := "Hello,世界!!!!!" b :=

golang中一些基础用法

佐手、 提交于 2019-12-05 00:25:10
range类似迭代器操作,返回 (索引, 值) 或 (键, 值)。其可以使用的对象包括string,array/slice,map,channel。其中string,array/slice返回的第一个value都是index,第二个value表示值;map返回第一个元素为key,第二个为value;channel中第一个值为元素的值。 举例如下: func main() { str := "abcdef" for key, value := range str { fmt.Printf("%d,%c\n", key, value) } array := [3]int{0, 1, 2}//注意,针对array,range 会复制对象。 for i, v := range array { if i == 0 { // index、value 都是从复制品中取出。 // 在修改前,我们先修改原数组。 array[1], array[2] = 999, 999 fmt.Println(array) // 确认修改有效,输出 [0, 999, 999]。 } array[i] = v + 100 // 使用用复制品中取出的 value 修改原数组。 } fmt.Println(array) // 输出 [100, 101, 102]。 //slice 为引用

golang跨平台编译

那年仲夏 提交于 2019-12-05 00:25:00
golang中跨平台交叉编译涉及两个重要的环境变量: GOOS和GOARCH ,分别代表Target Host OS和Target Host ARCH,如果没有显式设置这些环境变量,我们通过go env可以看到go编译器眼中这两个环境变量的当前值: go env GOARCH="amd64" GOBIN="/home/work/software/go/bin" GOEXE="" GOHOSTARCH="amd64" //主机arch GOHOSTOS="linux" //主机host GOOS="linux" GOPATH="/home/work/software/go/src/pkg:/home/work/develop/git/content_filter:/home/work/develop/git/content_filter/.koala" GORACE="" GOROOT="/home/work/software/go" GOTOOLDIR="/home/work/software/go/pkg/tool/linux_amd64" GO15VENDOREXPERIMENT="1" CC="gcc" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0" CXX="g++" CGO_ENABLED="1"

golang服务健壮性---(异常处理)

笑着哭i 提交于 2019-12-05 00:23:05
在程序开发时我们都会认为外部提供的接口或者数据都是不可信的。比如函数总是要检查入参的正确性,在做单元测试的时候要把外部提供的接口给屏蔽掉等。之所以都会这么做,主要还是很难保证自己还是其他人可以提供一个没有任何缺陷的接口。既然接口是人写的,那么多少会有些考虑不到的地方,这时候接口在被调用的时候就有可能发生错误或者异常。这里讨论golang中的异常处理机制,其实就是panic和recover这两个接口的运用,类似于C++中的try和catch。 1、golang中的panic panic,中文解释为恐慌。举个例子,单代码中出现这样的语句的时候,相信所有开发人员在产品上线的时候都会恐慌: var MakecoreData * int = nil *MakecoreData = 10000 如果不做任何处理的时候,这个golang出现如果跑到这里的时候就会出现这样的结果。 panic: runtime error : invalid memory address or nil pointer dereference [signal 0xc0000005 code= 0x1 addr= 0x0 pc= 0x5d0676 ] 然后重新就退出了,这个结果其实跟C/C++中的core是一样的。 当然这个例子可能不会有人会犯这种低级错误,但是如果这两个语句中间加上一段复制的逻辑

GOLANG空指针崩溃时堆栈消失和解决方案

☆樱花仙子☆ 提交于 2019-12-05 00:22:45
原文: https://gocn.io/article/351 在 错误处理 这个文章中, tkk 提出了空指针时堆栈消失的问题,看下面的 例子 : package main func main() { run() // line 4 } func run() { causedPanic() } func causedPanic() { //defer func() {}() // line 10 //panic("Panic from user") // line 11 var p * byte *p = 0 // line 13 } 这个程序崩溃时,打印的竟然是: panic : runtime error: invalid memory address or nil pointer dereference goroutine 1 [running]: main .main () /tmp/sandbox277759147/main .go : 4 + 0x4 神奇的是,把第10行的defer打开,变成 这样 : func causedPanic() { defer func () {}() // line 10 //panic("Panic from user") // line 11 var p * byte *p = 0 // line 13 } 堆栈神奇的回来了: