當(dāng)某些時候需要將結(jié)構(gòu)體進(jìn)行序列化的時候(類似Java的toString()方法)也需要實(shí)現(xiàn)go語言中的String()方法,舉個簡單的例子:
package main
import (
"bytes"
"encoding/json"
"fmt"
)
func main() {
dog := getDog(11, "kaka", 12, "little")
fmt.Println(dog.String())
}
type Dog struct {
//后面的部分是在對結(jié)構(gòu)體進(jìn)行序列化時對應(yīng)的數(shù)據(jù)類型以及別名
//要注意,如果結(jié)構(gòu)體對成員變量首字母小寫是不可以序列化的,不管給不給別名
ID int `json:"id"`
Name string `xml:"name"`
Age int `json:"age"`
flaw string `json:"flaw"`
}
func (d *Dog) String() string? {
//json.Marshal()的作用是將結(jié)構(gòu)體序列化為json格式的數(shù)據(jù)
//而與其對應(yīng)的是Unmashal()方法,將json數(shù)據(jù)反序列化為結(jié)構(gòu)體對象
//返回的是字節(jié)數(shù)組,由于沒有實(shí)現(xiàn)String()方法,所以需要一個實(shí)現(xiàn)了該方法的緩沖數(shù)組轉(zhuǎn)存一下
b, err := json.Marshal(*d)
//fmt.Println(reflect.TypeOf(b))
if err != nil {
return fmt.Sprint("%+v", *d)
}
//bytes.Buffer是一個字節(jié)緩沖結(jié)構(gòu)體對象
var out bytes.Buffer
//將b的內(nèi)容 加上`prefix` 以indent為縮進(jìn)轉(zhuǎn)存到out中
err = json.Indent(&out, b, "", "\t")
if err!= nil {
return fmt.Sprint("%+v", *d)
}
return out.String()
}
func getDog(id int, name string, age int, flaw string) Dog {
return Dog{
ID:? ?id,
Name: name,
Age:? age,
flaw: flaw,
}
}
2020-03-20
我就是想給同學(xué)們說一下需要注意的一些細(xì)節(jié)?