variable - 새로운 유형의 인스턴스(Golang)




golang variable default value (2)

누구든지 문자열에서 Type의 새 인스턴스를 만드는 방법을 말해 줄 수 있습니까? 비추다?

예가 있지만 언어의 이전 버전 (Go 1 이전 버전) [:(]


그래서, 만약 당신의 질문을 정확하게 이해한다면, 당신은 단지 타입의 이름을 문자열로 가지고있을 때 어떻게 객체를 생성 할 수 있는지 묻고 있습니다. 예를 들어, 문자열 "MyStruct"가있을 수 있으며이 유형의 객체를 만들고 싶습니다.

안타깝게도 Go는 정적으로 형식이 지정된 언어이고 링커가 데드 코드 (또는 인라인 부분)를 제거하기 때문에 쉽게 가능하지 않습니다. 따라서 최종 실행 파일에 "MyStruct"코드가 포함되어 있다는 보장은 없습니다.

그러나 전역 map[string]reflect.Type 수동으로 유지할 수 있습니다. 예를 들어, 발견 가능한 유형을 정의하는 패키지의 init() 함수에서이 맵을 초기화합니다. 또한 컴파일러에서 유형을 사용하고 있음을 알립니다. 그런 다음이 맵을 사용하여 reflect.Type 를 조회 할 수 있습니다. 작성하고 사용하려는 유형의 유형을 반영하십시오. 해당 유형의 새 오브젝트에 대한 포인터를 가져 오기 위해 reflect.New 작성하십시오 ( reflect.New 로 저장 됨). 다음과 같이 객체를 인터페이스로 추출 할 수 있습니다.

reflect.New(yourtype).Elem().Interface()

Elem() 은 포인터의 참조를 해제하고 Interface() 는 반영된 값을 interface{} 로 반환합니다. 자세한 내용 은 반사 법칙을 참조하십시오.

추신 : 리플렉션이 필요없고 컴파일러가 더 많은 오류를 잡을 수있는 프로그램을 구성하는 더 좋은 방법이있을 수 있습니다. 예를 들어 팩토리 메소드 사용을 고려 했습니까? 다른 쉬운 해결책은 map[string]func() interface{} 를 유지하는 것입니다.이 map[string]func() interface{} 는 그 이름을 가진 새로운 객체를 생성하기 위해 호출 될 수 있습니다.


미리 정의 된 생성자가있는 팩토리는 다음과 같은 것을 기반으로 할 수 있습니다.

package main

import (
    "fmt"
)

type Creator func() interface{}

type A struct {
    a int
}

type B struct {
    a bool
}

func NewA() interface{} {
    return new(A)
}

func NewB() interface{} {
    return new(B)
}

func main() {
    m := map[string]Creator{}
    m["A"] = NewA
    m["B"] = NewB
    for k, v := range m {
        fmt.Printf("%v -> %v\n", k, v())
    }
}




go-reflect