,
에 해당
b := append([]T(nil), a...)
, 예를 들어
b := make([]T, len(a))
copy(b, a)
,
package main
import "fmt"
type T int
func main() {
a := []T{4, 2}
b := append([]T(nil), a...)
fmt.Println(&a[0], a, &b[0], b)
b[0] = 9
fmt.Println(&a[0], a, &b[0], b)
}
출력 :
0x10328000 [4 2] 0x10328020 [4 2]
0x10328000 [4 2] 0x10328020 [9 2]
칙 :
Common difficulties with reflection
명 가고 처음 사용하는 경우, 그들은 전혀 반사를 사용해서는 안됩니다.
-rob
전문가의 경우에도 반사가 미묘합니다. 그것은 언어가 얼마나 작동하는지에 대한 아주 기본적인 것들을 알게되는 것에 따라 이해되고, 어느 정도 구현 되는가에 대한 세부 사항을 보여줍니다. 그것도 경험이 풍부한 프로그래머들에게 어리둥절해질 수 있습니다; 새롭게 에 대해 Gophers 발행일은 을 먼저 배우는 것이 훨씬 더 중요하고 간단합니다. 너무 일찍 반사를 배우는 사람들은 스스로 구름을 혼동합니다. 그 기본에 대한 이해. 사진의 나머지 부분이 분명해질 때까지 팔의 길이로 유지하는 것이 가장 좋습니다.
-rob 말했다
,
package main
import (
"fmt"
"reflect"
)
func CopySlice(s interface{}) interface{} {
t, v := reflect.TypeOf(s), reflect.ValueOf(s)
c := reflect.MakeSlice(t, v.Len(), v.Len())
reflect.Copy(c, v)
return c.Interface()
}
type T int
func main() {
{
// append
a := []T{4, 2}
b := append([]T(nil), a...)
fmt.Println(&a[0], a, &b[0], b)
b[0] = 9
fmt.Println(&a[0], a, &b[0], b)
}
{
// make and copy
a := []T{4, 2}
b := make([]T, len(a))
copy(b, a)
fmt.Println(&a[0], a, &b[0], b)
b[0] = 9
fmt.Println(&a[0], a, &b[0], b)
}
{
// reflection
a := []T{4, 2}
b := CopySlice(a).([]T)
fmt.Println(&a[0], a, &b[0], b)
b[0] = 9
fmt.Println(&a[0], a, &b[0], b)
}
}
출력 : 당신은 특별히 reflect.Copy
의 reflect
패키지를 사용하여 모든 유형의 사본을 할 수
0xc20800a200 [4 2] 0xc20800a210 [4 2]
0xc20800a200 [4 2] 0xc20800a210 [9 2]
0xc20800a290 [4 2] 0xc20800a2a0 [4 2]
0xc20800a290 [4 2] 0xc20800a2a0 [9 2]
0xc20800a310 [4 2] 0xc20800a320 [4 2]
0xc20800a310 [4 2] 0xc20800a320 [9 2]
그래서 본질적으로'a' 원소를'b' 원소에 할당 된 새로운 배열을위한 새로운 빈 조각에 추가합니다, 맞습니까? – Kaiged
'append' 메쏘드는'make' /'copy' 메쏘드만큼 성능이 좋습니까? – Kaiged
@Kaiged :'nil' 슬라이스에 추가하면'make'와'copy'로 변환됩니다. 내 수정 된 답변을 참조하십시오. – peterSO