| 152 | } |
| 153 | |
| 154 | func makeSliceNextElemFunc(v reflect.Value) func() reflect.Value { |
| 155 | elemType := v.Type().Elem() |
| 156 | |
| 157 | if elemType.Kind() == reflect.Ptr { |
| 158 | elemType = elemType.Elem() |
| 159 | return func() reflect.Value { |
| 160 | if v.Len() < v.Cap() { |
| 161 | v.Set(v.Slice(0, v.Len()+1)) |
| 162 | elem := v.Index(v.Len() - 1) |
| 163 | if elem.IsNil() { |
| 164 | elem.Set(reflect.New(elemType)) |
| 165 | } |
| 166 | return elem.Elem() |
| 167 | } |
| 168 | |
| 169 | elem := reflect.New(elemType) |
| 170 | v.Set(reflect.Append(v, elem)) |
| 171 | return elem.Elem() |
| 172 | } |
| 173 | } |
| 174 | |
| 175 | zero := reflect.Zero(elemType) |
| 176 | return func() reflect.Value { |
| 177 | if v.Len() < v.Cap() { |
| 178 | v.Set(v.Slice(0, v.Len()+1)) |
| 179 | return v.Index(v.Len() - 1) |
| 180 | } |
| 181 | |
| 182 | v.Set(reflect.Append(v, zero)) |
| 183 | return v.Index(v.Len() - 1) |
| 184 | } |
| 185 | } |