타입 단언과 타입 스위치
안전한 타입 단언과 switch 패턴
타입 단언과 타입 스위치은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
타입 단언
타입 단언은 인터페이스에서 구체 값을 추출합니다. 문법은 x.(T)입니다:
package main
import "fmt"
func main() {
var i interface{} = "hello"
s := i.(string) // panics if wrong type
fmt.Println(s, len(s)) // hello 5
}안전한 두 값 단언
잘못된 타입에서 패닉이 발생하지 않도록 쉼표-확인 형식을 사용하십시오:
package main
import "fmt"
func main() {
var i interface{} = 42
s, ok := i.(string)
fmt.Println(s, ok) // "" false
n, ok := i.(int)
fmt.Println(n, ok) // 42 true
}타입 스위치
타입 스위치는 인터페이스 값의 동적 타입을 여러 타입과 비교합니다:
package main
import "fmt"
func describe(i interface{}) string {
switch v := i.(type) {
case int: return fmt.Sprintf("int: %d", v)
case string: return fmt.Sprintf("string: %q", v)
case bool: return fmt.Sprintf("bool: %v", v)
default: return fmt.Sprintf("unknown: %T", v)
}
}
func main() {
fmt.Println(describe(42))
fmt.Println(describe("hi"))
fmt.Println(describe(3.14))
}error에 대한 타입 스위치
타입 스위치는 오류를 분류할 때 특히 유용합니다:
package main
import ("errors"; "fmt")
type NotFoundError struct{ Name string }
func (e *NotFoundError) Error() string { return e.Name + " not found" }
type PermError struct{}
func (e *PermError) Error() string { return "permission denied" }
func handle(err error) {
switch e := err.(type) {
case *NotFoundError: fmt.Println("missing:", e.Name)
case *PermError: fmt.Println("perm error")
default: fmt.Println("other:", e)
}
}
func main() {
handle(&NotFoundError{"user"})
handle(errors.New("generic"))
}인터페이스로 단언하기
구체 타입뿐 아니라 다른 인터페이스 타입으로도 단언할 수 있습니다. 객체가 선택적 동작을 지원하는지 확인할 때 유용합니다:
package main
import "fmt"
type Flusher interface{ Flush() }
type Writer interface{ Write(string) }
type BufferedWriter struct{ buf string }
func (b *BufferedWriter) Write(s string) { b.buf += s }
func (b *BufferedWriter) Flush() { fmt.Println(b.buf); b.buf = "" }
func maybeFlush(w Writer) {
if f, ok := w.(Flusher); ok { f.Flush() }
}
func main() {
bw := &BufferedWriter{}
bw.Write("hello")
maybeFlush(bw)
}nil 인터페이스 단언
nil 인터페이스에 대해 단언하면 패닉이 발생합니다. 단언하기 전에 항상 인터페이스가 nil이 아닌지 확인하십시오:
package main
import "fmt"
func safePrint(i interface{}) {
if i == nil {
fmt.Println("nil")
return
}
fmt.Printf("%T: %v\n", i, i)
}
func main() {
safePrint(nil)
safePrint(42)
}reflect.TypeOf 대안
단언하지 않고 타입을 출력하려면 fmt.Sprintf("%T", v) 또는 reflect.TypeOf(v)를 사용하십시오:
package main
import ("fmt"; "reflect")
func main() {
v := []int{1, 2, 3}
fmt.Printf("%T\n", v) // []int
fmt.Println(reflect.TypeOf(v)) // []int
}타입 단언과 타입 변환
타입 단언: 인터페이스에서 구체 타입을 추출합니다. 타입 변환: 한 구체 타입을 호환되는 다른 타입으로 변경합니다. 두 작업은 서로 다릅니다:
package main
import "fmt"
func main() {
var i interface{} = int32(5)
n := i.(int32) // assertion — OK
big := int64(n) // conversion — OK
fmt.Println(n, big)
}select에서의 콤마-오케이
콤마-오케이 패턴은 채널 수신에도 사용할 수 있으며, 닫힌 채널을 감지합니다. Go에서는 동일한 간결한 관용구를 일관되게 사용합니다.
타입 스위치를 사용하는 경우
일반적인 사용 사례는 다음과 같습니다:
interface{}필드를 사용한 JSON 역직렬화- 오류 분류
- 프로토콜 메시지 디스패치
- 선택적 인터페이스 확인(Flusher, Closer 등)
빠른 확인
실패하는 안전하지 않은 타입 단언의 결과는 무엇인가요?
복습
핵심 내용:
x.(T)는 타입이 잘못되면 패닉을 일으키고,x, ok := x.(T)는 안전합니다- 타입 스위치를 사용하면 여러 타입을 깔끔하게 처리할 수 있습니다
- 선택적 기능을 확인하려면 인터페이스로 단언합니다
- nil 인터페이스에는 절대 단언하지 않습니다
연습 문제
타입 스위치를 사용하여 int, float64, string(문자열을 파싱)을 처리하고, 그 외의 값은 건너뛰는 sum(values []any) float64 함수를 작성해 보세요.
자주 묻는 질문
“타입 단언과 타입 스위치” 강의는 무료인가요?
네 — “타입 단언과 타입 스위치” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“타입 단언과 타입 스위치”에서 뭘 배우나요?
안전한 타입 단언과 switch 패턴 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“타입 단언과 타입 스위치” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 인터페이스 정의와 구현
- 표준 라이브러리의 핵심 인터페이스
- 타입 단언과 타입 스위치
- 인터페이스 조합과 모범 사례