리플렉션이 있는 인터페이스에서 포인터 유형 및 값 변경
Go에서 인터페이스는 특정 메서드를 정의하지만 유형을 지정하지 않는 계약을 나타냅니다. 기본 개체의 이러한 유연성 덕분에 동적 바인딩이 가능하지만 인터페이스에서 정의한 변수의 포인터 유형과 값을 수정하려고 할 때 문제가 발생할 수도 있습니다.
인터페이스에서 포인터 유형과 값을 변경할 수 있나요?
리플렉션을 사용하면 인터페이스 아래의 포인터 값을 변경할 수 있습니다. 반사 값의 요소를 새 포인터 값의 요소로 설정하면 값을 수정할 수 있습니다. 그러나 포인터 유형을 직접 변경하는 것은 불가능합니다.
Reflection을 사용하여 포인터 값 변경
인터페이스에서 정의한 변수의 포인터 값을 변경하려면 다음을 따르세요. 단계:
예
다음 코드에서 a의 값은 다음을 사용하여 수정됩니다. Greeter2 개체를 가리키도록 반사하는 동시에 이름도 업데이트합니다. "Jack":
package main import ( "fmt" "reflect" ) type Greeter struct { Name string } func (g *Greeter) String() string { return "Hello, My name is " + g.Name } type Greeter2 struct { Name string } func (g *Greeter2) String() string { return "Hello2, My name is " + g.Name } func main() { var a fmt.Stringer a = &Greeter{"John"} fmt.Println(a.String()) // Output: Hello, My name is John v := reflect.ValueOf(&a).Elem() v.Set(reflect.ValueOf(&Greeter2{"Jack"}).Elem()) fmt.Println(a.String()) // Output: Hello2, My name is Jack }
참고: 변수의 포인터 유형을 수정하려면 주소로 전달되어야 합니다. Go는 복사를 통해 값을 전달하는데, 포인터만이 가리키는 값을 간접적으로 수정할 수 있도록 허용하기 때문입니다.
위 내용은 Go에서 리플렉션을 사용하여 인터페이스에 정의된 변수의 포인터 유형과 값을 변경할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!