zoukankan      html  css  js  c++  java
  • golang protobuf SetExtension

    对golang protobuf 的扩展字段赋值时候一直提示proto: bad extension value type 

    clkUrl:="z.cn"

    proto.SetExtension(seatbid, rtb.E_Clkurl, clkUrl)

    查看源码后发现,对扩展字段赋值的时候会对第二个参数进行反射获取类型,判断第三个参数的类型和第二个是否匹配 ,

    func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error {
    	epb, ok := extendable(pb)
    	if !ok {
    		return errors.New("proto: not an extendable proto")
    	}
    	if err := checkExtensionTypes(epb, extension); err != nil {
    		return err
    	}
    	typ := reflect.TypeOf(extension.ExtensionType)
    	if typ != reflect.TypeOf(value) {
    		return errors.New("proto: bad extension value type")
    	}
    	// nil extension values need to be caught early, because the
    	// encoder can't distinguish an ErrNil due to a nil extension
    	// from an ErrNil due to a missing field. Extensions are
    	// always optional, so the encoder would just swallow the error
    	// and drop all the extensions from the encoded message.
    	if reflect.ValueOf(value).IsNil() {
    		return fmt.Errorf("proto: SetExtension called with nil value of type %T", value)
    	}
    
    	extmap := epb.extensionsWrite()
    	extmap[extension.Field] = Extension{desc: extension, value: value}
    	return nil
    }
    

      

    通过打印第二个参数的类型发现 第二个参数类型是*string ,   我的第三个参数是sring,问题已经明了。

    阅读源码是解决问题的最好途径。

    修改后的代码如下:

    proto.SetExtension(seatbid, rtb.E_Clkurl, &clkUrl)

  • 相关阅读:
    UIView
    UISwitch
    UIButton
    label标签的属性
    sublime 生成网页头文件
    Xcode快捷键
    Bootstrap 模态对话框只加载一次 remote 数据的解决办法 转载
    用谷歌浏览器来当手机模拟器
    DDD:谈谈数据模型、领域模型、视图模型和命令模型
    MoQ(基于.net3.5,c#3.0的mock框架)简单介绍
  • 原文地址:https://www.cnblogs.com/lavin/p/5685791.html
Copyright © 2011-2022 走看看