2017-03-09 1 views
0

time.Time 구조를 JSON으로 인코딩/디코딩 될 구조에서 사용하려고합니다. time.Time 속성을 설정하지 않으면 (omitempty 태그) 포함시키지 말아야합니다. 그렇게하려면 time.Time 객체에 대한 포인터를 사용해야합니다. 내가 쉽게 시간을 포맷 수신기 기능을 만들 수 있도록 JSON 인코딩 및 디코딩 될 때수신기 메서드에서 nil 포인터에 할당

은 내가 time.Time 구조 유형을 정의 등

여기에 코드를 참조하십시오 : 그래서 https://play.golang.org/p/e81xzA-dzz

내 주의를 구조 (실제로 인코딩됩니다 구조) 나는 같은 것을 할 것입니다 :

type EncodeThis struct { 
    Str string `json:"str,omitempty"` 
    Date *jWDate `json:"date,omitempty"` 
} 

문제는 값을 디코딩 할 때 당신이 일에 내 코드를 볼 그래서 만약 포인터가, 전무가 될 수 있다는 것이다 e 놀이터로 가면 두 포인터를 사용하여 수신자의 주소를 설정하려고 시도하고 있다는 것을 알 수 있습니다. 메소드 "Set"및 "swap"을 참조하십시오.

하지만 이것은 제대로 작동하지 않는 것 같습니다. 프로그램이 실패하지 않거나 아무것도 아니지만 "EncodeThis"구조체에이 새 주소에 대한 참조가 포함되지 않습니다. 이것에 대한 수정을위한 아이디어?

+0

놀이터가 불완전합니다. 컴파일 가능한 상태로 수정하십시오. – I159

+0

문제는 그것의 천 줄의 코드와 많은 의존성입니다. 문제는 수신기 포인터가 nil 일 때 Set 메서드에 있습니다. Set-method 내에서 메모리를 할당하거나 주소를 다시 할당해야합니다. 그러나 나는 이것을 어떻게하는지 모른다. 아니면 정말 가능하다면. 최악의 경우 나는 생성시에 메모리를 생성해야하지만 포인터로 사용하면 쓸모가 없다. – Joachim

+0

http://stackoverflow.com/questions/23695479/format-timestamp-in-outgoing-json-in-golang – Ravi

답변

1

time.Time 개체에 대한 포인터가 들어있는 구조체로 날짜 개체를 래핑하십시오.

// JWDate: Numeric date value 
type jWDate struct { 
    date *time.Time 
} 

func (jwd *jWDate) Set(t *time.Time) { 
    if jwd.date == nil { 
     jwd.date = t 
    } 
} 

당신이 그것을 포함 할 수 있습니다 구조체는 jWDate에서 time.Time 방법에 액세스 할 수 있어야합니다. 내장 유형을 사용하면 개체 포인터에 쉽게 액세스 할 수 있습니다.

// JWDate: Numeric date value 
type jWDate struct { 
    *time.Time // Embedded `time.Time` type pointer, not just an attribute 
} 

func (jwd *jWDate) Set(t *time.Time) { 
    if jwd.Time == nil { 
     jwd.Time = t 
    } 
} 
+0

감사. 그러나 나는 이것을 어떻게 다뤄야 하는가를 디자인해야했고, 어떻게했는지와 비슷합니다. 나는'New()'메소드를 단순히 갖기 위해'jWDate' 구조체를 확장했다.이 메소드는 다른 go-routine에 의해 메모리 주소가 변경되지 않았 음을 보장하기 위해 메모리를 할당한다 (프로그래머가 필요로하는 것을 실제로 사용한다). . – Joachim

관련 문제