2009-11-13 4 views
3

Golang Initialization은 Go 프로그래밍 언어로 임의의 개체에 메서드를 첨부하는 방법을 설명합니다.Go에서의 함수 충돌

type ByteSize float64 
const (
    _ = iota; // ignore first value by assigning to blank identifier 
    KB ByteSize = 1<<(10*iota); 
    MB; 
    GB; 
    TB; 
    PB; 
    YB; 
) 

같은 형식으로 문자열 등의 방법을 첨부 할 수있는 기능도 같이 가능 등의 값은 인쇄를 위해 자동으로 스스로를 포맷 할 수 있습니다 : 예를 들어, 그들은 새로 정의 ByteSize 유형에 대한 String 방법을 보여 일반적인 유형의 일부. ByteSizefunc (b ByteSize) String() string 모두 어딘가에 패키지에 정의 된 경우, 나는 어떻게이하는 패키지 것을 가져하지만 내 자신의 문자열 방법을 사용하여 작성하여 ByteSize의 표시를 사용자 정의 할 수 : 그다지 분명하지 않다 무엇

func (b ByteSize) String() string { 
    switch { 
    case b >= YB: 
     return fmt.Sprintf("%.2fYB", b/YB) 
    case b >= PB: 
     return fmt.Sprintf("%.2fPB", b/PB) 
    case b >= TB: 
     return fmt.Sprintf("%.2fTB", b/TB) 
    case b >= GB: 
     return fmt.Sprintf("%.2fGB", b/GB) 
    case b >= MB: 
     return fmt.Sprintf("%.2fMB", b/MB) 
    case b >= KB: 
     return fmt.Sprintf("%.2fKB", b/KB) 
    } 
    return fmt.Sprintf("%.2fB", b) 
} 

은 다음이다 내 자신의 문자열 메서드 또는 이전에 정의 된 문자열 메서드를 호출할지 여부를 알 수 있습니까? 문자열을 다시 정의 할 수 있습니까? 당신이 새로운 방법을 원하는 경우 유형을 포장, 그래서 당신은

type MyByteSize ByteSize 
func (b MyByteSize) String() string{ 

} 
가 정의 당신은 모듈의 외부 유형에 방법을 정의 할 수

내가 믿는 정의 할에 대한

답변

9

의도는 .

+4

오른쪽. 다른 언어는 서브 클래스의 메소드를 오버라이드하여 동일한 문제를 해결합니다. 그러나 Go에서는 오브젝트 자체가 새로운 유형 일 필요는 없다는 장점이 있습니다. 어디서든 ByteSize를 가져 와서 MyByteSize 유형의 변수에 저장하고 대신 자신의 메서드를 사용할 수 있습니다. –

+2

또한 내부 표현이 동일하기 때문에 ByteSize와 MyByteSize 간의 변환은 IIRC가 필요하지 않습니다. –