// 设置单一值 func (self *DynamicMessage) SetValue(fd *pbmeta.FieldDescriptor, value string) bool { if fd == nil || !self.Desc.Contains(fd) { log.Errorf("field not found: '%s' in '%s', value: '%s'", fd.Name(), self.Desc.Name(), value) return false } if fd.Type() == pbprotos.FieldDescriptorProto_TYPE_MESSAGE { log.Errorf("field is message not value: '%s' in '%s', value: '%s'", fd.Name(), self.Desc.Name(), value) return false } fv := self.fetchValue(fd, false) if fd.IsRepeated() { log.Errorf("field is repeated by used like non-repeated value", fd.Name()) return false } // 可选字段 if fd.IsOptional() { var existValue string if fv != nil { existValue = fv.value } // 有指派默认值 if fd.DefaultValue() != "" { existValue = fd.DefaultValue() } else { // 没有指派默认值, 取值的默认值 existValue = GetDefaultValue(fd) } // 输入值和已经存在的值一致, 就无需设置了 if existValue == value { return true } } if fv == nil { fv = self.addValue(fd) } fv.value = value return true }