指针结构体
踩坑场景
gprc
生成的结构体都是这样的:
type BoxInfo struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// 省略上面字段...
//wifi
WiFi *WiFiClient `protobuf:"bytes,28,opt,name=WiFi,proto3" json:"WiFi,omitempty"`
// ... 省略下面字段
}
需求:
获取不到的信息就不返回,获取的就返回
我第一时间写的调试代码
大致过一眼,不需要关注业务,但是也得有个业务概念,具体看下面的场景转化
func (search *SearchService) GetBoxInfo(ctx context.Context, in *pb.DasLiteRequest) (*pb.BoxInfo, error) {
r := &pb.BoxInfo{}
conn, err := GetConn(_defaultHms)
if err != nil {
fmt.Println("获取hms_盒子信息grpc连接失败")
return r, err
}
client := common.NewCommonClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
ctx, cancel = context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
exist, err := client.FindModel(ctx, &common.Model{Key: common.ModelKey_Wifi})
if err == nil && exist.OK {
fmt.Println("存在wifi模块")
wifiRpcClient := wifi.NewWifiRpcClient(conn)
ctx, cancel = context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
detail, err := wifiRpcClient.LoadCurrentClientDetail(ctx, &common.NullParam{})
fmt.Println("获取wifi2的信息为: ", detail)
if err == nil {
fmt.Println("获取wifi的信息为: ", detail)
r.WiFi.Uuid = detail.Uuid
r.WiFi.WpaState = detail.WpaState
r.WiFi.Address = detail.Address
r.WiFi.Freq = detail.Freq
r.WiFi.Bssid = detail.Bssid
r.WiFi.Id = detail.Id
r.WiFi.Gateway = detail.Gateway
r.WiFi.GroupCipher = detail.GroupCipher
r.WiFi.IpAddress = detail.IpAddress
r.WiFi.KeyMgmt = detail.KeyMgmt
r.WiFi.PairwiseCipher = detail.PairwiseCipher
r.WiFi.Mode = detail.Mode
r.WiFi.Ssid = detail.Ssid
}
} else {
fmt.Println("获取wifi失败")
}
return r, nil
}
实际场景转化为原理代码
package main
import "fmt"
type Grpc struct {
A *A
B *B
}
type A struct {
AName string
}
type B struct {
BName string
}
func main() {
res := &Grpc{A:&A{}}
res.A.AName = "a"
res.B.BName = "b"
fmt.Println(res)
}
# 代码输出
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x1 addr=0x8 pc=0x8a7a74]
goroutine 1 [running]:
main.main()
E:/code_me/pratice/cmd2/main.go:23 +0x94
exit status 2
解决方案
把B的初始化也加上
package main
import "fmt"
type Grpc struct {
A *A
B *B
}
type A struct {
AName string
}
type B struct {
BName string
}
func main() {
res := &Grpc{A: &A{}, B: &B{}} // 注意这里
res.A.AName = "a"
res.B.BName = "b"
fmt.Println(res)
}