2016-11-13 17 views
6

gdy uruchomię ryk fragment kodu, to podniesie błądgolang stwardnienie przypadku przełącznika typu

a.test niezdefiniowany (typ interfejsu {} jest interfejs bez metod)

się wydawać przełącznik typu nie działa.

package main 

import (
    "fmt" 
) 

type A struct { 
    a int 
} 

func(this *A) test(){ 
    fmt.Println(this) 
} 

type B struct { 
    A 
} 

func main() { 
    var foo interface{} 
    foo = A{} 
    switch a := foo.(type){ 
     case B, A: 
      a.test() 
    } 
} 

Gdybym go zmienić na

switch a := foo.(type){ 
     case A: 
      a.test() 
    } 

teraz jest OK.

Odpowiedz

3

Jest to normalne zachowanie, które jest określone przez the spec (kopalni nacisk)

TypeSwitchGuard może obejmować krótki zmienny zgłoszenie. Gdy ten formularz jest używany, zmienna jest zadeklarowana na początku domyślnego bloku w każdej klauzuli. W klauzulach ze sprawą zawierającą dokładnie jeden typ, zmienna ma ten typ; w przeciwnym razie zmienna ma typ wyrażenia w TypeSwitchGuard.

Więc w rzeczywistości, przełącznik typu robi się skuteczna, ale zmienna a utrzymuje typ interface{}.

Jeden sposób można obejść ten problem jest assert że foo ma metodę test(), który będzie wyglądał tak:

package main 

import (
    "fmt" 
) 

type A struct { 
    a int 
} 

func (this *A) test() { 
    fmt.Println(this) 
} 

type B struct { 
    A 
} 

type tester interface { 
    test() 
} 

func main() { 
    var foo interface{} 
    foo = &B{} 
    if a, ok := foo.(tester); ok { 
     fmt.Println("foo has test() method") 
     a.test() 
    } 
} 
+0

widzę. bardzo, bardzo – yjfuk

Powiązane problemy