1:https://developers.google.com/protocol-buffers/docs/reference/php-generated //proto php
2:https://developers.google.com/protocol-buffers/docs/reference/go-generated //go
3:https://godoc.org/github.com/golang/protobuf/proto#pkg-constants // go package
4:https://developers.google.com/protocol-buffers/docs/reference/proto3-spec //proto3语法
上述网址需翻墙~
syntax = "proto3";
message data {
string username = 1;
int64 password = 2;
int32 sex = 3;
string address = 4;
bool is_check = 5;
}
message result {
string message = 1;
int32 code = 2;
}
生成其他文件:
$ protoc -I ./ --php_out ./ first.proto
$ protoc -I ./ --go_out ./ first.proto
$ protoc -I ./ --c_out ./ first.proto
<?php
require_once "result.php";
require_once "data.php";
$param = [
'username' => 'xxxoo',
'password' => '123456',
'sex' => '1',
'address' => 'xxxxx地址',
'is_check' => true,
'message' => 'success',
'code' => 200,
];
$data = achieveData($param);
$results = verify($data);
var_dump($results);
function achieveData($param) {
$data = new data();
$result = new result();
//存取数据
$data->setUsername($param['username']);
$data->setPassword(md5($param['password']), true);
$data->setSex($param['sex']);
$data->setAddress($param['address']);
$data->setIsCheck($param['is_check']);
return $data->serializeToString();
$result->setMessage($param['message']);
$result->setCode($param['code']);
$results = [
'data' => $data->serializeToString(),
'results' => $result->serializeToString()
];
return $results;
}
function verify($param) {
$data = new data();
$result = new result();
$data->parseFromString($param['data']);
$result->parseFromString($param['results']);
return $data->dump() . '\n' . $result->dump();
}
//go
syntax = "proto3";
package expload;
message Single {
string name = 1;
int32 age = 2 ;
int64 mobile = 3;
}
package main
import (
pb "../expload"
"fmt"
"github.com/golang/protobuf/proto"
"log"
)
func main() {
data := &pb.Single {
Name:string("hello "),
Age:int32(13),
Mobile:int64(17601261496),
}
//sha1加密
res, err := proto.Marshal(data)
if err != nil {
log.Fatal("marshaling is err", err)
}
//数据解码
enCode := &pb.Single{}
err = proto.Unmarshal(res, enCode)
if err != nil {
log.Fatal("Unmarshaling is err", err)
}
if data.GetName() != enCode.GetName() {
log.Fatal("data is not the same %q != %q", data.GetName(), enCode.GetName())
}
//解数据则可以用新对象去调用get则可以
fmt.Println(enCode.GetName())
}
注意的是 二和三的语法不同