go设置多个GOPATH
go设置多个GOPATHlinux:
1GOPATH="/home/www/gopath1:/home/www/gopath2"
windows:
1GOPATH=f:/gopath1;f:/gopath2;
注意:go get 时默认安装到第一个GOPATH路径
go build时,有时会报同一种类型或方法不匹配,由于多个是GOPATH路径顺序不对导致的,调换一下顺序即可解决
GO类型转换及与C的类型转换
GO类型转换及与C的类型转换类型转换语法
1dst := float32(src)
示例
123var num int = 520f32 := float32(num)i64 := int64(num)
注意:加入 val 是一个指针, int32(val) 相当于*(int32(var1)) ,指针不能直接转换成一个int32类型,应该改为 (*int32)(var1) ,所以某些类型可能引起误会的应该用括号括起来转换。
类型断言语法
12dst,ok := src.(int) // 安全类型断言,通过ok判断是否转换成功dst := src.(int) // 非安全类型断言,无法确定是否转换成功
示例
12345678var val interface{} = 123num,ok := val.(int)if ok { fmt.Printf("%T->%d\n", num, num)} else { fmt.Println("类型不匹配")}
其他转换go提供 ...
go程序中加载go编写的插件
golang版本: 1.5 以上支持动态库,1.8以上支持plugin
go提供的plugin包可以实现热更新的功能。
Go插件是使用-buildmode = plugin标记编译的一个包,用于生成一个共享对象(.so)库文件。 Go包中的导出的函数和变量被公开为ELF符号,可以使用plugin包在运行时查找并绑定ELF符号。
Go编译器能够使用build flag -buildmode = c-shared创建C风格的动态共享库。
从1.8版开始,Go插件功能只能在Linux上使用。 很有可能在将来的版本中发生变化。
pluginPlugintype Plugin即Golang加载的插件,与之有关的两个方法:
Open: 根据参数path提供的插件路径加载这个插件,并返回插件这个插件结构的指针*Glugin
Lookup: *Plugin的惟一方法,通过名称symName在插件中寻找对应的变量或方法,以Symbol的形式返回
Symbol根据定义type Symbol interface{},Symbol是interface的别名,也就是说,我们可以从插件里面拿到任何类型的 ...
Go命令
go 1.12
1.go build编译包和依赖用法:go build [-o output] [-i] [build flags] [packages]
-o 指定输出的文件名,可以带上路径,例如 go build -o a/b/c
-i 安装相应的包,编译+go install
-a 更新全部已经是最新的包的,但是对标准包不适用
-n 把需要执行的编译命令打印出来,但是不执行
-p n 指定可以并行可运行的编译数目,默认是CPU数目
-race 开启编译的时候自动检测数据竞争的情况,目前只支持64位的机器
-v 打印出来我们正在编译的包名
-msan 启用与内存清理程序的操作。仅在linux / amd64,linux / arm64上支持并且只有Clang / LLVM作为主机C编译器。
-work 打印出来编译时候的临时文件夹名称,并且如果已经存在的话就不要删除
-x 打印出来执行的命令,其实就是和-n的结果类似,只是这个会执行
-ccflags 'arg list' 传递参数给5c, ...
小工具
http://www.rejetto.com/hfs/ 小型http服务器,可用于前端调试
你可以通过下面链接发现更多的 Go 编辑器的插件: https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins
http://www.q-dir.com/
https://www.heidisql.com/
https://cmder.net/ (https://github.com/cmderdev/cmder/releases)
cmder.exe /REGISTER ALL
http://www.cygwin.com
apt-cyg install nano
cmder
12task->Startup->Tasks->新增task(+)->Commands->cmd.exe /k "C:\cygwin64\Cygwin.bat"task->Startup->Environment->chcp gbk
cygwin
1234567891011 ...
wrk压力测试
wrk压力测试
GitHub - wg/wrk: Modern HTTP benchmarking tool
wrk 是一个比较先进的 HTTP 压力测试工具,当在单个多核 CPU 上运行时,能够产生大量负载。它结合了多线程设计和可扩展的事件通知系统,例如 epoll 和 kqueue。
可选的 LuaJIT 脚本可以执行 HTTP 请求生成,响应处理和自定义报告。
1. wrk工具编译1234# https://github.com/tsliwowicz/go-wrkgit clone https://github.com/wg/wrk.gitcd wrkmake
2. wrk参数说明wrk -h
12345678-c, --connections <N> 跟服务器建立并保持的TCP连接数量-d, --duration <T> 压测时间-t, --threads <N> 使用多少个线程进行压测,压测时,是有一个主线程来控制我们设置的n个子线程间调度-s, --script <S> 指定Lu ...
grpc-网关
HTTP网关源自coreos的一篇博客 Take a REST with HTTP/2, Protobufs, and Swagger。
etcd3 API全面升级为gRPC后,同时要提供REST API服务,维护两个版本的服务显然不太合理,所以grpc-gateway诞生了。通过protobuf的自定义option实现了一个网关,服务端同时开启gRPC和HTTP服务,HTTP服务接收客户端请求后转换为grpc请求数据,获取响应后转为json数据返回给客户端。
结构如图:
安装grpc-gateway12$ git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto$ go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
目录结构12345678910111213141516|—— hello_http/ |—— client/ |—— main.go ...
grpc-trace例子
内置Tracegrpc内置了客户端和服务端的请求追踪,基于golang.org/x/net/trace包实现,默认是开启状态,可以查看事件和请求日志,对于基本的请求状态查看调试也是很有帮助的,客户端与服务端基本一致,这里以服务端开启trace server为例,修改hello项目服务端代码:
目录结构123456789|—— hello_trace/ |—— client/ |—— main.go // 客户端 |—— server/ |—— main.go // 服务端|—— proto/ |—— hello/ |—— hello.proto // proto描述文件 |—— hello.pb.go // proto编译后文件
示例代码服务端
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647package mainimport ( "fmt" "net" "net/ht ...
grpc-拦截器例子
Interceptor 拦截器grpc服务端和客户端都提供了interceptor功能,功能类似middleware,很适合在这里处理验证、日志等流程。
在自定义Token认证的示例中,认证信息是由每个服务中的方法处理并认证的,如果有大量的接口方法,这种姿势就太不优雅了,每个接口实现都要先处理认证信息。这个时候interceptor就可以用来解决了这个问题,在请求被转到具体接口之前处理认证信息,一处认证,到处无忧。在客户端,我们增加一个请求日志,记录请求相关的参数和耗时等等。修改hello_token项目实现:
目录结构123456789101112|—— hello_interceptor/ |—— client/ |—— main.go // 客户端 |—— server/ |—— main.go // 服务端|—— keys/ // 证书目录 |—— server.key |—— server.pem|—— proto/ |—— hello/ |—— hello.proto // proto描述文件 |—— hello.pb.go ...
grpc-认证例子
认证gRPC默认内置了两种认证方式:
SSL/TLS认证方式
基于Token的认证方式
同时,gRPC提供了接口用于扩展自定义认证方式
TLS认证示例这里直接扩展hello项目,实现TLS认证机制
首先需要准备证书,在hello目录新建keys目录用于存放证书文件。
证书制作制作私钥 (.key)12345# Key considerations for algorithm "RSA" ≥ 2048-bit$ openssl genrsa -out server.key 2048# Key considerations for algorithm "ECDSA" ≥ secp384r1# List ECDSA the supported curves (openssl ecparam -list_curves)$ openssl ecparam -genkey -name secp384r1 -out server.key
自签名公钥(x509) (PEM-encodings .pem|.crt)1$ openssl req - ...
grpc-Hello例子
Hello gRPC按照惯例,这里也从一个Hello项目开始,本项目定义了一个Hello Service,客户端发送包含字符串名字的请求,服务端返回Hello消息。
流程
编写.proto描述文件
编译生成.pb.go文件
服务端实现约定的接口并提供服务
客户端按照约定调用.pb.go文件中的方法请求服务
环境下载对应平台的代码生成工具(或者自行编译)
https://github.com/google/protobuf/releases
安装编译插件
12345678910111213# 在gopath的bin目录下生成protoc-gen-go.exego get -u github.com/golang/protobuf/{proto,protoc-gen-go}git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpcgit clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/ ...
grpc-go教程
gRPC 基础: Go本教程提供了 Go 程序员如何使用 gRPC 的指南。
通过学习教程中例子,你可以学会如何:
在一个 .proto 文件内定义服务。
用 protocol buffer 编译器生成服务器和客户端代码。
使用 gRPC 的 Go API 为你的服务实现一个简单的客户端和服务器。
假设你已经阅读了概览 并且熟悉protocol buffers。 注意,教程中的例子使用的是 protocol buffers 语言的 proto3 版本,它目前只是 alpha 版:可以在 proto3 语言指南和 protocol buffers 的 Github 仓库的版本注释发现更多关于新版本的内容。
这算不上是一个在 Go 中使用 gRPC 的综合指南:以后会有更多的参考文档.
为什么使用 gRPC?我们的例子是一个简单的路由映射的应用,它允许客户端获取路由特性的信息,生成路由的总结,以及交互路由信息,如服务器和其他客户端的流量更新。
有了 gRPC, 我们可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中 ...
grpc-通讯协议
HTTP2 协议上的 gRPC本文档作为 gRPC 在 HTTP2 草案17框架上的实现的详细描述,假设你已经熟悉 HTTP2 的规范。产品规则采用的是ABNF 语法
大纲以下是 gRPC 请求和应答消息流中一般的消息顺序:
请求 → 请求报头 *有定界符的消息 EOS
应答 → 应答报头 *有定界符的消息 EOS
应答 → (应答报头 *有定界符的消息 跟踪信息) / 仅仅跟踪时
请求
请求 → 请求报头 *界定的消息 EOS 请求报头是通过报头+联系帧方式以 HTTP2 报头来发送的。
请求报头 → 调用定义 *自定义元数据
调用定义 → 方法模式路径TE [授权] [超时] [内容类型] [消息类型] [消息编码] [接受消息类型] [用户代理]
方法 → “:method POST”
模式 → “:scheme ” (“http” / “https”)
路径 → “:path” {开放的 API 对应的方法路径}
Authority → “:authority” {授权的对应的虚拟主机域名}
TE → “te” “trailers” # 用来检 ...
grpc-错误处理和调试
错误处理和调试错误处理此页面描述了gRPC如何处理错误,包括gRPC的内置错误代码。 可以在此处找到不同语言的示例代码。
错误模型正如您在我们的概念文档和示例中所看到的,当gRPC调用成功完成时,服务器会向客户端返回OK状态(取决于语言,OK状态可能会或可能不会直接在您的代码中使用)。 但如果通话不成功会怎样?
如果发生错误,gRPC会返回其错误状态代码之一,并带有可选的字符串错误消息,该消息提供有关所发生情况的更多详细信息。 所有支持的语言中的gRPC客户端都可以使用错误信息。错误状态代码
gRPC在各种情况下引发错误,从网络故障到未经认证的连接,每个连接都与特定的状态代码相关联。 所有gRPC语言都支持以下错误状态代码。
一般错误GRPC_STATUS_CANCELLED 客户端应用程序取消了请求
GRPC_STATUS_DEADLINE_EXCEEDED 截止日期在服务器返回状态之前到期
GRPC_STATUS_UNIMPLEMENTED 在服务器上找不到方法
GRPC_STATUS_UNAVAILABLE 服务器关闭
GRPC_STATUS_UNKNOWN 服务器抛出异常(或 ...
grpc-安全认证
认证gRPC 被设计成可以利用插件的形式支持多种授权机制。本文档对多种支持的授权机制提供了一个概览,并且用例子来论述对应API,最后就其扩展性作了讨论。 马上将会推出更多文档和例子。
支持的授权机制SSL/TLSgRP 集成 SSL/TLS 并对服务端授权所使用的 SSL/TLS 进行了改良,对客户端和服务端交换的所有数据进行了加密。对客户端来讲提供了可选的机制提供凭证来获得共同的授权。
OAuth 2.0gRPC 提供通用的机制(后续进行描述)来对请求和应答附加基于元数据的凭证。当通过 gRPC 访问 Google API 时,会为一定的授权流程提供额外的获取访问令牌的支持,这将通过以下代码例子进行展示。 警告:Google OAuth2 凭证应该仅用于连接 Google 的服务。把 Google 对应的 OAuth2 令牌发往非 Google 的服务会导致令牌被窃取用作冒充客户端来访问 Google 的服务。
API为了减少复杂性和将混乱最小化, gRPC 以一个统一的凭证对象来进行工作。 凭证可以是以下两类:
频道凭证, 被附加在 频道上, 比如 ...
grpc-概念
gRPC 概念本文档通过对于 gRPC 的架构和 RPC 生命周期的概览来介绍 gRPC 的主要概念。本文是在假设你已经读过文档部分的前提下展开的。针对具体语言细节请查看对应语言的快速开始、教程和参考文档(很快就会有完整的文档)。
概览服务定义正如其他 RPC 系统,gRPC 基于如下思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型。gRPC 默认使用 protocol buffers 作为接口定义语言,来描述服务接口和有效载荷消息结构。如果有需要的话,可以使用其他替代方案。
1234567891011service HelloService { rpc SayHello (HelloRequest) returns (HelloResponse);}message HelloRequest { required string greeting = 1;}message HelloResponse { required string reply = 1;}
gRPC 允许你定义四类服务方法:
单项 ...
grpc-快速开始
开始欢迎进入 gRPC 的开发文档,gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。 本文档通过快速概述和一个简单的 Hello World 例子来向您介绍 gRPC 。你可以在本站发现更详细的教程和参考文档——文档将会越来越丰富。
快速开始为了直观地着手运行 gRPC,可以从你所选择的语言对应的快速开始入手,里面包含创建这个列子的安装指导、快速上手指南等更多内容。
C++
Java
Go
Python
Ruby
Node.js
Android Java
C#
Objective-C
PHP
你可以从这里找到 gRPC 的源码库。我们大多数例子都在源码库 examples 目录下。
gRPC 是什么?在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个 ...
grpc学习资料
grpc官网文档:https://grpc.io/docs/guides/
grpc官网文档(中文版):http://doc.oschina.net/grpc
grpc接口文档:https://godoc.org/google.golang.org/grpc
grpc相关书籍:https://www.bookstack.cn/search/result?wd=grpc
Flex布局
一、Flex 布局是什么?
转载:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool原作者:阮一峰
Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
任何一个容器都可以指定为 Flex 布局。
123.box{ display: flex;}
行内元素也可以使用 Flex 布局。
123.box{ display: inline-flex;}
Webkit 内核的浏览器,必须加上-webkit前缀。
1234.box{ display: -webkit-flex; /* Safari */ display: flex;}
注意,设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。
二、基本概念采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器&q ...
npm常用命令
npm常用命令123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104#初始化 引导你创建一个package.json文件npm init#查看package.json文件内容格式npm help json#安装模块 (install 可简写为 i)npm install moduleName#全局安装npm install moduleName -g#更新本机npm的版本npm install -g#设置镜像源npm config set registry http://registry.npm.taobao.orgnpm config set registry https://registry.npmjs.org#安装package. ...