struct String
{
byte* str
intgo len
}
这个结构体让我想起了nginx的string,他是这样定义的:
typedef struct {
size_t len
u_char *data
} ngx_str_t
golang里边 string的概念其实不是以前遇到\0结尾的概念了,他其实就是一块连续的内存,首地址+长度,上面那样赋值,如果p里边有\0,他不会做处理这个时候,如果再对这个string做其他处理就可能出问题了,比如strconv.Atoi转成int就有错误,解决办法就是需要自己写一个正规的转换函数:
func byteString(p []byte) string {
for i := 0i <len(p)i++ {
if p[i] == 0 {
return string(p[0:i])
}
}
return string(p)
}
这样就不会出问题了
结构体与[]byte不能直接转化,可以通过gob来转换。编码时如下,假设默认的结构体为datafunc Encode(data interface{}) ([]byte, error) { buf := bytes.NewBuffer(nil) enc := gob.NewEncoder(buf) err := enc.Encode(data) if err != nil { return nil, err } return buf.Bytes(), nil }解码时如下,data为需要解码的字节数组,to为相应的接收结构体,记住to的结构体结构应与被编码的data相一致,解码后内容保存在to里面,直接使用to即可func Decode(data []byte, to interface{}) error { buf := bytes.NewBuffer(data) dec := gob.NewDecoder(buf) return dec.Decode(to) }使用的时候:b, err := Encode(data) if err != nil { //错误处理 } if err := Decode(b, &to)err != nil { //错误处理}