zoukankan      html  css  js  c++  java
  • 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)
    }
    
    
  • 相关阅读:
    TC79
    SQL TUNNING
    Oracle PLSQL
    DB String Split sample
    dw websites
    Load xlsx in a folder to RDBMS table with Talend
    Reading WebSites
    SQOOP Load Data from Oracle to Hive Table
    dotnet use regex two samples
    Excel scientific notation issue
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14888636.html
Copyright © 2011-2022 走看看