Golang에서 인터페이스로 전달된 익명 구조체 액세스{}
Go에서는 다음 구문을 사용하여 메서드 없이 인터페이스를 정의할 수 있습니다. 인터페이스{}. 그러나 이러한 인터페이스를 구현하는 유형으로 작업하면 특히 익명 구조체의 필드에 액세스하려고 할 때 문제가 발생할 수 있습니다.
익명 구조체를 함수에 매개 변수로 전달하려는 다음 예를 고려하세요.
<code class="go">package main import ( "fmt" "log" "time" ) type job struct { name string action func() custom interface{} } func NewJob(t string, name string, c func(), v interface{}) { job := process(t) job.name = name job.action = c job.custom = v go func() { for { job.action() time.Sleep(2 * time.Second) } }() } func Custom(name string) interface{} { for _, j := range jobs { if j.name != name { continue } return j.custom } return nil } func main() { NewJob("every 2 second", "pene", func() { t := Custom("pene") log.Println(t) }, struct { ID int }{ 1, }) }</code>
이 예시에서 NewJob 함수는 v라는 인터페이스 유형 매개변수를 사용합니다.{} 함수 내에서 작업 구조체의 사용자 정의 필드를 v로 설정합니다. 그런 다음 2초마다 제공된 기능을 실행하는 고루틴이 있는 작업입니다. 고루틴 내에서 Custom 함수를 사용하여 사용자 정의 필드를 검색하고 익명 구조체의 ID 필드에 액세스하려고 시도합니다. 그러나 오류가 발생합니다.
t.ID undefined (type interface {} is interface with no methods)
이는 인터페이스{} 유형에 메서드가 없어 기본 유형의 필드에 직접 액세스할 수 없기 때문입니다. 이 문제를 해결하려면 해당 필드에 액세스하기 전에 먼저 인터페이스를 적절한 유형으로 "유형 어설션"해야 합니다. 이 경우 기본 유형이 익명 구조체 {ID int}라는 것을 알고 있으므로 다음과 같이 이를 유형 어설션할 수 있습니다.
<code class="go">id := v.(struct{ID int}).ID</code>
v를 올바른 구조체 유형으로 어설션하는 유형을 통해 이제 액세스할 수 있습니다. ID 필드는 예상대로입니다.
위 내용은 Golang에서 '인터페이스{}'로 전달된 익명 구조체의 필드에 어떻게 액세스합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!