2016-10-25 2 views
1

인터페이스에 대해 많이 읽었는데 어떻게 작동하는지 이해할 수 있습니다. 나는 interface{} 타입에 대해 읽고 함수의 인수를 취하기 위해 그것을 사용한다. 그것은 분명합니다. 내 질문 (그리고 내가 이해하지 못하는 것)은 내가 그것을 사용한다면 내 이익이다. 내가 완전히 그것을 얻을하지 않았다 가능하지만, 예를 들어 나는이있다 : 왜 이것보다 더 나은골란 인터페이스 혜택

package main 

import (
    "fmt" 
) 

func PrintAll(vals []interface{}) { 
    for _, val := range vals { 
     fmt.Println(val) 
    } 
} 

func main() { 
    names := []string{"stanley", "david", "oscar"} 
    vals := make([]interface{}, len(names)) 
    for i, v := range names { 
     vals[i] = v 
    } 
    PrintAll(vals) 
} 

입니다 : 당신은 항상 다음 string 값을 인쇄 할 경우

package main 

import (
    "fmt" 
) 

func PrintAll(vals []string) { 
    for _, val := range vals { 
     fmt.Println(val) 
    } 
} 

func main() { 
    names := []string{"stanley", "david", "oscar"} 
    PrintAll(names) 
} 
+0

당신이 방법 기본이되는 구현을 변경할 수있는 경우 인터페이스를 사용하지만, 그것을 사용하는 모든 코드를 변경하지 :

또한 관련 질문을 참조하십시오. – Carcigenicate

답변

1

첫 번째는 []interface{}을 사용하는 것이 더 좋지 않습니다. 컴파일 타임 검사를 잃으면 더 나빠집니다 : string 이외의 값을 포함하는 슬라이스를 전달하면 경고하지 않습니다.

string 이외의 값을 인쇄하려는 경우 []string의 두 번째는 컴파일되지 않습니다.

PrintAll([]interface{}{"one", 2, 3.3}) 

2 당신에게 컴파일 타임 오류 줄 것 동안 :

cannot use []interface {} literal (type []interface {}) as type []string in argument to PrintAll

제 2 회 당신에게 컴파일시 보증을 제공을 만 조각

는 예를 들어, 첫 번째는이 처리 형식이 []string 인 경우 전달됩니다. 다른 것을 전달하려고하면 컴파일 타임 오류가 발생합니다. Why are interfaces needed in Golang?

+0

감사합니다. 간단한 실제 세계의 예를 들어 주시겠습니까? 괜찮습니다. 실세계 문제에서 인터페이스 {}를 어떻게 활용할 수 있을지 상상할 수 없습니다. – PumpkinSeed

+0

예제에서 호출하는 @PumpkinSeed ['fmt.Println()'] (https://golang.org/pkg/fmt/#Println)도'interface {}'유형의 값을 취합니다. 그것에 어떤 가치. – icza

+0

감사합니다. 구현을 확인합니다. – PumpkinSeed