###### tags: `note`
luck is a choice
===
```go=
package main
import (
"fmt"
"reflect"
)
func main() {
cloneSlice()
cloneMap()
}
func cloneSlice() {
content := []string{"foo", "bar"}
in := reflect.ValueOf(content)
size := len(content)
out := reflect.MakeSlice(in.Type(), size, size)
for i, elem := range content {
out.Index(i).SetString(elem)
}
for i, v := range out.Interface().([]string) {
fmt.Printf("%d: %v\n", i, v)
}
}
func cloneMap() {
content := map[string]string{
"foo": "FOO",
"bar": "BAR",
}
in := reflect.ValueOf(content)
out := reflect.MakeMap(in.Type())
for k, v := range content {
out.MapIndex(reflect.ValueOf(k)).SetString(v) // unlucky :(
// if you want assign value into the map, you should use Value.SetMapIndex(k, v)
// e.g:
// out.SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(v))
//
// good luck!
}
for k, v := range out.Interface().(map[string]string) {
fmt.Printf("%v: %v\n", k, v)
}
}
```
🎬 https://go.dev/play/p/3s23CVqX-lh
⠿ 要填入 map 的值可使用下面的方式:
```go=
package main
import (
"fmt"
"reflect"
)
func main() {
content := map[string]string{
"foo": "FOO",
"bar": "BAR",
}
var outType reflect.Type = reflect.TypeOf(map[string]***string{})
out := reflect.MakeMap(outType)
for k, v := range content {
var rv reflect.Value
{
/* NOTE: The reflection statements same as
*
* var elem **string
* **elem = v
* out[k] = elem
*/
var rvpcount int = 0
var rvt reflect.Type = out.Type().Elem()
for {
if rvt.Kind() != reflect.Ptr {
break
}
rvpcount++
rvt = rvt.Elem()
}
rv = reflect.New(rvt).Elem()
rv.SetString(v)
for i := 0; i < rvpcount; i++ {
if rv.CanAddr() {
rv = rv.Addr()
} else {
parent := reflect.New(rv.Type())
parent.Elem().Set(rv)
rv = parent
}
}
}
out.SetMapIndex(reflect.ValueOf(k), rv)
}
for k, v := range out.Interface().(map[string]***string) {
fmt.Printf("%v: %v\n", k, ***v)
}
}
```
🎬 https://go.dev/play/p/M4XAuL8zAFl