下面就来看一些解决方案: go-bindata go-bindata 是目前我的程序 pugo 在用的嵌入静态资源的工具。它可以把静态文件嵌入到一个 go 文件中,并提供一些操作方法。 安装 go-bindata: go get -u github.com/jteeuwen/go-bindata/... 注意 go get 地址最后的三个点 ...。 使用命令工具 go-bindata ( pugo 的例子): go-bindata -o=app/asset/asset.go -pkg=asset source/... theme/... doc/ go-bindata 的第三方包 go-bindata-assetfs 实现了这个接口,支持 HTTP 访问静态文件目录的行为。 最后选择 go-bindata。但是 go-bindata 和 go.rice 都是将纯字符数据或 []byte 字符数据写入 go 文件,内容非常大。
目前项目中会用到的 go-bindata 的项目主要有四个,分别是: (1500+ stars)https://github.com/go-bindata/go-bindata (840+ stars) 在这几个仓库中,go-bindata/go-bindata 是知名度最高的版本,elazarl/go-bindata-assetfs 提供了原版软件不支持 net/http 使用的 FS 封装。 当然,开源社区中的软件发展经常是交错的,在 elazarl/go-bindata-assetfs 提供了 FS 封装不久,go-bindata/go-bindata 也提供了 -fs 参数,支持了将嵌入资源和 相比较原版以及go-bindata/go-bindata 代码,它的代码健壮程度更好,并且修正了社区用户对 go-bindata/go-bindata 反馈的一些问题,添加了一些社区用户期望的新功能。 mkdir basic-go-bindata && cd basic-go-bindata go mod init solution-embed 这里有一个小细节,因为 go-bindata/go-bindata
目前项目中会用到的 go-bindata 的项目主要有四个,分别是: (1500+ stars)https://github.com/go-bindata/go-bindata (840+ stars) 在这几个仓库中,go-bindata/go-bindata 是知名度最高的版本,elazarl/go-bindata-assetfs 提供了原版软件不支持 net/http 使用的 FS 封装。 当然,开源社区中的软件发展经常是交错的,在 elazarl/go-bindata-assetfs 提供了 FS 封装不久,go-bindata/go-bindata 也提供了 -fs 参数,支持了将嵌入资源和 相比较原版以及go-bindata/go-bindata 代码,它的代码健壮程度更好,并且修正了社区用户对 go-bindata/go-bindata 反馈的一些问题,添加了一些社区用户期望的新功能。 mkdir basic-go-bindata && cd basic-go-bindata go mod init solution-embed 这里有一个小细节,因为 go-bindata/go-bindata
安装工具 安装打包工具 go-bindata 到GOPATH/bin中 # ... @master 安装依赖 go-bindata只是把静态文件转化成 go 文件,在代码中读取这些静态文件需要使用go-bindata-assetfs go get -u github.com/elazarl /go-bindata-assetfs 使用 切换到项目路径下,这里一个 web 服务器为例,所有静态资源放在 www 目录下 执行go-bindata -o=data/data.go -pkg=data 文件中拿文件数据 如果只需要简单地读文件,可以不使用go-bindata-assetfs,因为go-bindata生成的 go 文件本身提供的一些方法返回文件的[]byte内容,可以根据需求自已去拿 每次静态文件改动的话在打包前记得重新执行go-bindata命令
使用 go-bindata-assetfs 进行打包 2. 安装 go-bindata-assetfs 3. 打包文件 4. 重新配置 5. 使用 使用 go-bindata --help 可以查看具体的使用方式 go-bindata --help Usage: go-bindata [options] <input directories> 使用 go-bindata-assetfs 进行打包 Serve embedded files from go-bindata with net/http. go-bindata-assetfs 实现了 安装 go-bindata-assetfs 这个需要和 go-bindata 一起安装,如果已经安装了 go-bindata 则不需要再次安装 go get github.com/go-bindata /jteeuwen/go-bindata https://github.com/elazarl/go-bindata-assetfs https://github.com/go-bindata/go-bindata
current &= (unsigned char)0x3F; base64[j++] = base64char[(int)current]; current = ( (unsigned char)(bindata ) ) & ( (unsigned char) 0x0F ); base64[j++] = base64char[(int)current]; current = ( (unsigned char)(bindata { base64[j++] = base64char[(int)current]; base64[j++] = '='; break; } current |= ( (unsigned char)(bindata 6) ) & ( (unsigned char) 0x03 ); base64[j++] = base64char[(int)current]; current = ( (unsigned char)bindata feof( f_image ) ) { bytes = fread( bindata, 1, 2049, f_image ); base64_encode( bindata, base64, bytes
的安装 我们在 make build 时可能会遇到 缺少 go-bindata 的问题: # make build Generating static files internal/migrations /migrations.go:1: running "go-bindata": exec: "go-bindata": executable file not found in $PATH make: *** [statics] Error 1 go get -u github.com/jteeuwen/go-bindata/... 安装完了之后可能会找不到go-bindata,提示错误:“-bash: /usr/bin/go-bindata: No such file or directory”。 找到之后,在PATH里面追加go-bindata的路径。
实现步骤如下: 下载两个Golang的第三方包 go get github.com/jteeuwen/go-bindata/... go get github.com/elazarl/go-bindata-assetfs 使用 “go install” 命令分别编译获得 go-bindata.exe 和 go-bindata-assetfs.exe 文件 执行 “go-bindata-assetfs.exe views /views目录下所有文件写入 bindata_assetfs.go 文件 bindata_assetfs.go文件中提供了名为 assetFS() 的函数,它返回包含了view文件内容的 http.Filesystem
[i++] = (unsigned char)((t >> 16) & 0xff); if (g > 1) bindata[i++] = (unsigned char)((t >> 8) & 0xff); if (g > 2) bindata[i++] = (unsigned char)(t & 0xff); y = t = 0; } } return i; } int __cdecl base64_encode(char *bindata, char *base64, int binlength) { int v3; // eax char [i] >> 2) & 0x3F); current = (bindata[i] << 4) & 0x30; if (i + 1 >= binlength) { v5 [i + 1] >> 4) | current); currenta = 4 * bindata[i + 1] & 0x3C; if (i + 2 >= binlength) {
与 go-bindata 类似,esc 同样提供了将静态文件转换为go源码并暴露了类似于http.FileSystem的API来读取数据的功能。 github.com/mjibson/esc 使用 https://github.com/mjibson/esc#example 对比: https://github.com/jteeuwen/go-bindata https://github.com/mjibson/esc https://github.com/rakyll/statik https://github.com/gobuffalo/packr go-bindata 、go.rice 和 esc 简单对比:https://studygolang.com/articles/5068 esc 没有 go-bindata 那样丰富的API,但会将嵌入的字节数据压缩,大大缩小了代码以及编译后的二进制程序体积
third_party/swagger-ui 目录下 cp xx/dist/* my_grpcgateway/third_party/swagger-ui/ 安装必要的静态资源转换包 第一,先下载 go-bindata ,用处是 go-bindata 用来将 swagger-ui 的源码转为 GO 代码 go get -u github.com/jteeuwen/go-bindata/... 第二,下载 go-bindata-assetfs,用处是 go-bindata-assetfs 能够结合 net/http 标准库和 go-bindata 所生成 Swagger UI 的 Go 代码两者来供外部访问 ,也就是说 go-bindata-assetfs 可以对外提供文件服务,这样可以通过web访问swagger的 json 文件 go get -u github.com/elazarl/go-bindata-assetfs 在 my_grpcgateway 目录下新建 pkg 目录,并使用工具在 pkg 目录下新增 swagger-ui 涉及的代码 cd my_grpcgateway mkdir pkg go-bindata
unsigned char current; for ( i = 0, j = 0 ; i < binlength ; i += 3 ) { current = (bindata unsigned char)0x3F; base64[j++] = base64char[(int)current]; current = ( (unsigned char)(bindata '; base64[j++] = '='; break; } current |= ( (unsigned char)(bindata char) 0x0F ); base64[j++] = base64char[(int)current]; current = ( (unsigned char)(bindata ]; base64[j++] = '='; break; } current |= ( (unsigned char)(bindata
二进制的长度,需要通过$binarySize来实现 5.1 构造数据 db.images.insertMany([ { _id: 1, name: "cat.jpg", binary: new BinData (0, "OEJTfmD8twzaj/LPKLIVkA==")}, { _id: 2, name: "big_ben.jpg", binary: new BinData(0, "aGVsZmRqYWZqYmxhaGJsYXJnYWZkYXJlcTU1NDE1Z2FmZCBmZGFmZGE =")}, { _id: 3, name: "tea_set.jpg", binary: new BinData(0, "MyIRAFVEd2aImaq7zN3u/w==")}, { _id: 4, name: "concert.jpg", binary: new BinData(0, "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4 =")}, { _id: 5, name: "empty.jpg", binary: new BinData(0, "") } ]) 5.2 查询集合中所有文档binary字段的长度(byte)
setSex(true); //$data = $person->serializeToString(); //file_put_contents('data.bin', $data); //反序列化 $bindata /data.bin'); $person = new Test\Person(); $person->mergeFromString($bindata); echo $person->getName() '; include 'GPBMetadata/Person.php'; include 'Test/Item.php'; include 'Test/Item/Obj.php'; //反序列化 $bindata /data.bin'); $person = new Test\Item(); $person->mergeFromString($bindata); echo $person->serializeToJsonString
$this->binData = $filename; } $this->size = strlen($this->binData); } } public function skip($skip) { $this->binData = substr($this->binData, $skip); , 0, 1); $this->binData = substr($this->binData, 1); return ord($byte); ->binData = substr($this->binData, 2); if($this->order) { $short = (ord($ $this->binData||(strlen($this->binData) === 0); } } ?
对于_id字段通常会有以下建议: 使用ObjectId 如果可以,可以使用数据中唯一的字段来充当_id,这样可以节省存储空间和避免额外的索引 使用自增长的数字 如果使用UUID,可以将UUID转换为BinData 进行存储,对于BinData类型的数据,如果BinData的子类型值在0-7或128-135并且字节数组的长度是0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20 类型都有其对应的数字和字符串表示,如下: 通过$type字段我们可以查出字段为某个类型的Document,如下: db.products.find({_id: {$type: 7}}) Binary Data binData 从小到大依次为: MinKey (internal type) Null Numbers (ints, longs, doubles, decimals) Symbol, String Object Array BinData BinData 首先比较数据的长度 其次再比较其subtype 最后才是逐字节比较数据 BinData的sub type主要有以下类型: MongoDB Extended JSON JSON是BSON的一个子集
clusterTime" : Timestamp(1534816254, 1), "signature" : { "hash" : BinData clusterTime" : Timestamp(1534816364, 1), "signature" : { "hash" : BinData clusterTime" : Timestamp(1534818896, 1), "signature" : { "hash" : BinData clusterTime" : Timestamp(1534818908, 2), "signature" : { "hash" : BinData clusterTime" : Timestamp(1534818928, 1), "signature" : { "hash" : BinData
/vendor/github.com/jteeuwen/go-bindata/go-bindata +++ [0316 13:45:02] Building go targets for linux/amd64 kube-proxy mounter conversion-gen e2e_node.test genkubedocs genyaml go-bindata Removing test/e2e/generated/bindata.go .. kubectl命令对应的源码文件:$GOPATH/src/k8s.io/kubernetes/cmd/kubectl/ /vendor/github.com/jteeuwen/go-bindata/go-bindata +++ [0316 11:49:46] Building go targets for linux/amd64
go-bindata/go-bindatagobuffalo/packrmarkbates/pkgerrakyll/statik使用go-bindata将数据文件转换成Go代码安装go-bindata: go get -u github.com/go-bindata/go-bindata/...将配置文件生成Go代码:go-bindata -o configs/config.go -pkg configs
/test 42 | wasm打包到golang二进制中 这里我们用 github.com/go-bindata/go-bindata go get -u github.com/go-bindata/ go-bindata/... 把wasm生成一个add.go文件 go-bindata -o add.go add/target/wasm32-unknown-unknown/release/add.wasm 然后稍微改一行我们的golang