Index: service/datastore/pls_impl.go |
diff --git a/service/datastore/pls_impl.go b/service/datastore/pls_impl.go |
index f2d3e43114e2c86bd645a02b55014f9a41084525..9a369123c59cf58b2431ab169fa568f2638bcfea 100644 |
--- a/service/datastore/pls_impl.go |
+++ b/service/datastore/pls_impl.go |
@@ -359,7 +359,12 @@ func (p *structPLS) SetMeta(key string, val interface{}) (err error) { |
val = Off |
} |
} |
- p.o.Field(idx).Set(reflect.ValueOf(val)) |
+ f := p.o.Field(idx) |
+ if val == nil { |
+ f.Set(reflect.Zero(f.Type())) |
+ } else { |
+ f.Set(reflect.ValueOf(val)) |
+ } |
return nil |
} |
@@ -369,7 +374,7 @@ var ( |
// The RWMutex is chosen intentionally, as the majority of access to the |
// structCodecs map will be in parallel and will be to read an existing codec. |
// There's no reason to serialize goroutines on every |
- // gae.datastore.{Get,Put}{,Multi} call. |
+ // gae.Interface.{Get,Put}{,Multi} call. |
structCodecsMutex sync.RWMutex |
structCodecs = map[reflect.Type]*structCodec{} |
) |
@@ -563,6 +568,11 @@ func convertMeta(val string, t reflect.Type) (interface{}, error) { |
switch t { |
case typeOfString: |
return val, nil |
+ case typeOfKey: |
+ if val != "" { |
+ return nil, fmt.Errorf("key field is not allowed to have a default: %q", val) |
+ } |
+ return nil, nil |
case typeOfInt64: |
if val == "" { |
return int64(0), nil |