2014-06-08 2 views
3

최근에 골란과 레벨을 배우기 시작했습니다. 아래 if 문이 정확히 무엇인지 이해하려고 시도하고 있습니다. 그것은 형식 검사를하고있는 것처럼 보이지만, 나는 조건부가 성취하는 것을 보지 못한다. 아무도 나에게 여기에서 무슨 일이 일어 났는지 말할 수 있다면 감사하게 생각해. 덕분에골란의 복잡한 조건문

if str, ok := obj.(string); ok { 
return len(str) > 0 
} 

답변

4

그것은 문자열로 (아마 추상적 인 인터페이스 인) OBJ 변환을 시도, 그 일을 확인하는 경우에만 괜찮아 밝혀졌다 입력하면. 실제 형식으로 일부 인터페이스에서 안전 주조는 않습니다 가서 무엇

// do a type assertion/conversion of obj to a string. 
// If obj isn't really a string, ok will be false 
str, ok := obj.(string) 

// this will only run if we're talking about a string 
if ok { 
return len(str) > 0 
} 

:

더 드문 드문로 볼 수 있습니다 작성. ok 부분없이이 작업을 수행하면 obj가 문자열이 아닌 경우 프로그램에서 패닉이 발생합니다.

str := obj.(string) 
return len(str) > 0 

당신은 문서의 타입 주장에 대한 자세한 내용을보실 수 있습니다 :

http://golang.org/ref/spec#Type_assertions

+1

아! 의미가 있습니다. 빠른 응답을 보내 주셔서 감사합니다. – broun

3

이것은 type assertion라고 obj가 문자열이 아닌 경우, 즉이 코드는 프로그램을 충돌합니다. 변수 objinterface{}입니다. 즉, 실제 유형이 한 실행에서 다른 실행으로 변경 될 수 있습니다. 타입 어설 션은 interface{}의 실제 유형을 결정하는 데 사용됩니다.

str = obj.(string) 

이 하나가 안전하지 않은 것입니다 : 지금까지 objstring가 아닌 경우, 프로그램이 당황합니다 그렇게하는 방법은 두 가지가 있습니다. 다른 하나는 코드에서 사용한 것입니다. objstring이 아닌 경우 ok 부울은 false이됩니다. 예를 들어

:

func f(v []interface{}) { 
    if str, ok := v.(string); ok { 
     fmt.Println("v is a string!") 
    } else if f, ok := v.(float64); ok { 
     fmt.Println("v is a float64!") 
    } else { 
     fmt.Println("v is something else...") 
    } 
} 
f(17.42) // "v is a float64!" 
f("foobar") // "v is a string!" 
f([]string{"hello", "world"}) // "v is something else..." 
+0

고마워. .. – broun