grpc指针结构体

指针结构体

踩坑场景

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)
}

原文地址:https://www.cnblogs.com/maomaomaoge/p/14888636.html