2016-10-20 3 views
0

경고 : 새내기 가십시오. 다음과 같은 함수가 있습니다.함수를 이동 중에 여러 유형을 허용하려면 어떻게합니까?

package main 
import "flag" 
import "fmt" 

func print_out_type(x anything) string { 
    switch v := x.(type) { 
     case string: 
      return "A string" 
     case int32: 
      return "An Integer" 
     default: 
      return "A default" 
    } 
} 

func main() { 
    wordPtr := flag.String("argument1", "foo", "a String") 
    numPtr := flag.Int("argument2", 42, "an Integer") 
    flag.Parse() 
    fmt.Println("word: ", *wordPtr) 
    fmt.Println("number: ", *numPtr) 
} 

유형에 따라 다른 유형의 문자열을 반환하려고합니다. 나는 다른 유형의 인수를 받아들이는 함수를 작성하는 방법에 대해 고민하고있다. 어떤 도움을 주셔서 감사합니다.

+0

'FUNC print_out_type (X 인터페이스 {}) string' – sberry

+2

사용'인터페이스를 {인쇄됩니다 . 이것은 빈 인터페이스입니다. 모든 유형이 그것을 구현합니다. Go에 대한 괜찮은 튜토리얼을 끝내야합니다. 매우 기본적인 것입니다. – kostix

답변

1

인터페이스 유형을 인수로 사용할 수 있습니다.이 경우 인터페이스를 구현하는 모든 유형의 함수를 호출 할 수 있습니다. Go 형식에서는 인터페이스의 메서드가 있으면 모든 인터페이스를 자동으로 구현합니다. 따라서 가능한 모든 유형을 허용하려는 경우 빈 인터페이스 (interface{})를 사용할 수 있습니다. 모든 유형은이를 구현하기 때문입니다. 귀하의 기능에 대한 다른 수정은 필요하지 않습니다.

func print_out_type(x interface{}) string { 
    switch v := x.(type) { 
     case string: 
      return "A string" 
     case int32: 
      return "An Integer" 
     default: 
      return "A default" 
    } 
} 

반사 패키지를 사용하여 인터페이스 변수 유형을 연구 할 수도 있습니다. 예를 들어 :

func print_out_type(x interface{}) string { 
    return reflect.TypeOf(x).String() 
} 

func main() { 
    fmt.Println(print_out_type(42)) 
    fmt.Println(print_out_type("foo")) 
} 

는 형식으로`}

INT

문자열

-3
  1. 먼저 유형 어설 션을 사용하는 경우이 작업이 성공했는지 확인해야합니다. eg: value, ok := temp.(int)
  2. 둘째, interface{} 유형 변수를 함수의 매개 변수로 사용할 수 있습니다. 함수에서 타입 어설 션을 사용하여 매개 변수의 실제 유형을 확인하고 인쇄 할 수 있습니다.
+0

유형 스위치가있는 유형 어설 션이 필요하지 않습니다. – Kaedys

+0

OP가 유형 어설 션을 사용하지 않고 어느 쪽도 아니어야합니다. – jussius

관련 문제