Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

golang setting

Language/go lang 2018.02.21 16:46
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



golang 셋팅


'Language > go lang' 카테고리의 다른 글

golang setting  (0) 2018.02.21
go lang song? zz  (0) 2018.02.20
golang factory  (0) 2018.02.13
golang - Package json  (0) 2018.02.09
valid 시 non zero value required 오류  (0) 2018.02.02
Review  (0) 2017.10.24

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

golang factory

Language/go lang 2018.02.13 13:18
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


golang factory?


[ 호출부]

json.NewDecoder(reader).Decode(&msg)


[Decode]

func (dec *Decoder) Decode(v interface{}) error {
if dec.err != nil {
return dec.err
}

if err := dec.tokenPrepareForDecode(); err != nil {
return err
}

if !dec.tokenValueAllowed() {
return &SyntaxError{msg: "not at beginning of value"}
}

// Read whole value into buffer.
n, err := dec.readValue()
if err != nil {
return err
}
dec.d.init(dec.buf[dec.scanp : dec.scanp+n])
dec.scanp += n

// Don't save err from unmarshal into dec.err:
// the connection is still usable since we read a complete JSON
// object from it before the error happened.
err = dec.d.unmarshal(v)

// fixup token streaming state
dec.tokenValueEnd()

return err
}


위의 소스에서 Decode 함수를 보자.

err = dec.d.unmarshal(v)라는게 눈에 띈다.

아래의 Encode함수도 마찬가지로 err := e.marshal(v, encOpts{escapeHTML: enc.escapeHTML}) 이라는게 있다.

[Encode]

func (enc *Encoder) Encode(v interface{}) error {
if enc.err != nil {
return enc.err
}
e := newEncodeState()
err := e.marshal(v, encOpts{escapeHTML: enc.escapeHTML})
if err != nil {
return err
}

// Terminate each value with a newline.
// This makes the output look a little nicer
// when debugging, and some kind of space
// is required if the encoded value was a number,
// so that the reader knows there aren't more
// digits coming.
e.WriteByte('\n')

b := e.Bytes()
if enc.indentPrefix != "" || enc.indentValue != "" {
if enc.indentBuf == nil {
enc.indentBuf = new(bytes.Buffer)
}
enc.indentBuf.Reset()
err = Indent(enc.indentBuf, b, enc.indentPrefix, enc.indentValue)
if err != nil {
return err
}
b = enc.indentBuf.Bytes()
}
if _, err = enc.w.Write(b); err != nil {
enc.err = err
}
encodeStatePool.Put(e)
return err
}


아래의 링크를 타고 내용을 보면 Marshal의 값은 v를 재귀적으로 호출한다.  v는 인터페이스!  또한 발생한 값이 Marshal 인터페이스를 구현하고 nil pointer가

아닐 경우 MarshalJSON 메소드를 호출하여 JSON을 생성하는 프로세스이다. 그러므로 아래처럼 MarshalJSON메소드를 구현 해주면 그녀석이 발동 된다는 것이다.

func Marshal(v interface{}) ([]byte, error)

2018/02/09 - [Language/go lang] - golang - Package json


예를 들어 아래와 같이 메소드가 있다면 아래의 MarshalJSON()을 호출하여 그안에서 factory를 생성한다.

func (m *AceTMessage) MarshalJSON(b []byte) error {


m.Test = newFactory(m.Header.Type)


}


newFactory() 가 factory관련 소스이다.

var exFactory = map[string]func() Test{ // type에 따라 처리가 되어지는 구조.



- 끝 - 









'Language > go lang' 카테고리의 다른 글

golang setting  (0) 2018.02.21
go lang song? zz  (0) 2018.02.20
golang factory  (0) 2018.02.13
golang - Package json  (0) 2018.02.09
valid 시 non zero value required 오류  (0) 2018.02.02
Review  (0) 2017.10.24

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

golang - Package json

Language/go lang 2018.02.09 13:44
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

import "encoding/json"

json 패키지는 RFC 4627에 정의 된 JSON의 인코딩 및 디코딩을 구현합니다. 

JSON 및 Go 값 간의 매핑은 marshal 및 unmarshal 함수에 대한 설명서에 설명되어 있습니다.

func Marshal(v interface{}) ([]byte, error)

Marshal은 v의 JSON 인코딩을 반환합니다. Marshal은 값 v를 재귀적으로 호출한다.
발생한 값이 
Marshal 인터페이스를 구현하고 nil 포인터가 아닌 경우 MarshalJSON 메서드를 호출하여 JSON을 생성합니다. 
MarshalJSON 메서드가 없지만 값이 encoding.TextMarshaler를 대신 구현하면 Marshal은 해당 MarshalText 메서드를
호출하고 결과를 JSON 문자열로 인코딩합니다. 
nil 포인터 예외가 반드시 필요한 것은 아니지만 UnmarshalJSON의 동작에서 비슷하고 필요한 예외를 모방합니다.
그렇지 않은 경우, Marshal은 다음과 같은 유형 종속 기본 인코딩을 사용합니다.

부울 값은 JSON 부울 값으로 인코딩됩니다. 부동 소수점, 정수 및 숫자 값은 JSON 숫자로 인코딩됩니다.

문자열 값은 유효한 UTF-8로 강제 변환 된 JSON 문자열로 인코딩되어 유효하지 않은 바이트를 유니 코드 대체 문자로 대체합니다. 꺽쇠 괄호 "<"및 ">"는 "\ u003c"및 "\ u003e"로 이스케이프 처리되어 일부 브라우저가 JSON 출력을 HTML로 오해하지 않게합니다. 앰퍼샌드 "&"도 같은 이유로 "\ u0026"로 이스케이프됩니다. 이 이스케이프는 SetEscapeHTML (false)가 호출 된 인코더를 사용하여 비활성화 할 수 있습니다. 배열 및 슬라이스 값은 JSON 배열로 인코딩됩니다. 단, [] 바이트는 base64 인코딩 된 문자열로 인코딩되고 nil 슬라이스는 null JSON 값으로 인코딩됩니다. 구조체 값은 JSON 객체로 인코딩됩니다. 각 내보내기 된 구조체 필드는 개체 이름으로 필드 이름을 사용하여 개체의 멤버가됩니다. 필드가 아래에 나와있는 이유 중 하나로 생략되지 않는 한 각 구조체 필드의 인코딩은 구조체 필드의 태그에서 "json"키 아래에 저장된 형식 문자열을 사용하여 사용자 정의 할 수 있습니다. 형식 문자열은 필드의 이름을 제공하며 그 뒤에 쉼표로 구분 된 옵션 목록이옵니다. 기본 필드 이름을 무시하지 않고 옵션을 지정하려면 이름이 비어있을 수 있습니다.

"omitempty"옵션은 필드에 빈 값이 있거나 false, 0, nil 포인터, nil 인터페이스 값 및 빈 배열, 슬라이스, 맵 또는 문자열로 정의 된 필드가 인코딩에서 생략되어야한다고 지정합니다. ex) Field int `json:"myName,omitempty"` / Field int `json:",omitempty"`

특수한 경우 필드 태그가 "-"인 경우 필드는 항상 생략됩니다. ex) Field int `json:"-"`

이름이 "-"인 필드는 여전히 "-"태그를 사용하여 생성 할 수 있습니다. ex) Field int `json:"-,"`

유니 코드 문자, 숫자 및 ASCII 구두점 (인용 부호, 백 슬래시 및 쉼표 제외)으로 구성된 비어 있지 않은 문자열 인 경우 키 이름이 사용됩니다.

익명 구조체 필드는 일반적으로 내부 내보내기 필드가 외부 구조체의 필드 인 것처럼 마샬링되며 다음 단락에서 설명하는대로 일반적인 Go 가시성 규칙이 수정됩니다. JSON 태그에 주어진 이름을 가진 익명 구조체 필드는 익명이 아닌 해당 이름을 가진 것으로 취급됩니다. 인터페이스 유형의 익명 구조체 필드는 익명이 아닌 이름으로 해당 유형을 갖는 것과 동일하게 취급됩니다.

마샬링 또는 언 마샬링 할 필드를 결정할 때 구조체 필드에 대한 가시성 규칙이 JSON에 맞게 수정되었습니다. 같은 레벨에 여러 개의 필드가 있고 해당 레벨이 가장 작은 중첩 된 경우 (따라서 일반 Go 규칙에 의해 선택된 중첩 레벨이 됨) 다음과 같은 추가 규칙이 적용됩니다.
1) 이러한 필드 중 JSON 태그가 있는 경우 태그가없는 필드가 여러 개있는 경우에도 태그가있는 필드만 고려됩니다.
2) 정확히 하나의 필드 (첫 번째 규칙에 따라 태그가 지정 되었는지 여부)가 선택되면 해당 필드가 선택됩니다.

3) 그렇지 않으면 여러 필드가 있으며 모두 무시됩니다. 오류가 발생하지 않습니다.

익명 구조체 필드의 처리는 Go 1.1에서 새로 추가되었습니다. Go 1.1 이전에는 익명 구조체 필드가 ​​무시되었습니다. 현재 버전과 이전 버전의 익명 구조체 필드를 강제로 무시하려면 해당 필드에 "-"JSON 태그를 지정하십시오.

예제)

func Unmarshal(data []byte, v interface{}) error

Unmarshal은 JSON으로 인코딩 된 데이터를 구문 분석하고 결과가 v가 가리키는 값에 저장합니다. v가 nil이거나 포인터가 아닌 경우 Unmarshal은 InvalidUnmarshalError를 반환합니다.

Unmarshal은 마샬러가 사용하는 인코딩의 역함수를 사용하여 필요에 따라 maps, slices 및 포인터를 할당하고 다음과 같은 추가 규칙을 사용합니다.

Unmarshal은 JSON을 포인터로 unmarshal하기 위해 먼저 JSON 리터럴 null 인 JSON의 대소문자를 처리합니다. 이 경우 Unmarshal은 포인터를 nil로 설정합니다. 그렇지 않으면, Unmarshal은 JSON을 포인터가 가리키는 값으로 unmarshal합니다. 포인터가 nil이면 Unmarshal은 포인터가 가리키는 새 값을 할당합니다.

JSON을 Unmarshaler 인터페이스를 구현하는 값으로 unmarshal하기 위해 Unmarshal은 입력 값이 JSON null 인 경우를 포함하여 해당 값의 UnmarshalJSON 메서드를 호출 합니다. 그렇지 않은 경우 값이 encoding.TextUnmarshaler를 구현하고 입력 값이 JSON 인용 문자열이면 Unmarshal은 해당 값의 UnmarshalText 메소드를 인용되지 않은 문자열 형식으로 호출합니다.

JSON을 구조체로 unmarshal하려면 Unmarshal이 들어오는 객체 키를 marshal(구조체 필드 이름 또는 해당 태그)에서 사용하는 키와 일치 시키며 정확히 일치하는 것을 선호하지만 대 / 소문자를 구분하지 않는 일치를 허용합니다. Unmarshal은 구조체의 내 보낸 필드 만 설정합니다.

JSON 배열을 Go 배열로 unmarshal하기 위해 Unmarshal은 JSON 배열 요소를 해당 Go 배열 요소로 디코딩합니다. Go 배열이 JSON 배열보다 작은 경우 추가 JSON 배열 요소가 삭제됩니다. JSON 배열이 Go 배열보다 작은 경우 추가 Go 배열 요소는 0 값으로 설정됩니다.

.








'Language > go lang' 카테고리의 다른 글

go lang song? zz  (0) 2018.02.20
golang factory  (0) 2018.02.13
golang - Package json  (0) 2018.02.09
valid 시 non zero value required 오류  (0) 2018.02.02
Review  (0) 2017.10.24
test code..반성!  (0) 2017.10.13

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

valid 시 non zero value required 오류

Language/go lang 2018.02.02 14:20
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


func checkRequired(v reflect.Value, t reflect.StructField, options tagOptionsMap) (bool, error) {
if requiredOption, isRequired := options["required"]; isRequired {
if len(requiredOption) > 0 {
return false, Error{t.Name, fmt.Errorf(requiredOption), true}
}
return false, Error{t.Name, fmt.Errorf("non zero value required"), false}
} else if _, isOptional := options["optional"]; fieldsRequiredByDefault && !isOptional {
return false, Error{t.Name, fmt.Errorf("All fields are required to at least have one validation defined"), false}
}
// not required and empty is valid
return true, nil
}


위의 validator.go 소스를 살펴보자.

requried면 value를 가지고 체킹을 하게 된다.

즉, 값이 0이 들어오는데 required를 사용하게 된다면 false인 것이다. 즉 valid가 유효하지 못하다.

제거를 해주면 0이나 "" 이 들어와도 값이 없는 것으로 간주하지는 않을 것이다.

golang ref : 

 - https://godoc.org/

 - https://play.golang.org/


열공 열공~!

'Language > go lang' 카테고리의 다른 글

golang factory  (0) 2018.02.13
golang - Package json  (0) 2018.02.09
valid 시 non zero value required 오류  (0) 2018.02.02
Review  (0) 2017.10.24
test code..반성!  (0) 2017.10.13
golang Context란?  (0) 2017.09.07

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

go lang을 해보자.

Language/go lang 2017.02.03 10:39
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

  1. 링크를 통해 OS에 맞는 것을 다운 받는다. (https://golang.org/dl/)
  2. home에서 go dir를 하나 만들어준다.
  3. 다운 받은 pkg를 클릭클릭 하여 셋팅해준다.
  4. .bash_profile에 환경변수를 잡아준다. 

        # GOPATH
        export GOPATH=$HOME/go
        PATH=${PATH}:/usr/local/go/bin:${GOPATH}/bin

    5. go 라는 명령어를 통해 잘 깔렸는지 확인.

더보기


go가 이제 셋팅 되었다! 코드를 짜기전에 github에 레파지토리를 하나 만들자.

   6. github repository 생성

위에서 home밑에 go 디렉토리를 만들어줬다. 이제 그 아래에 src라는 디렉토리를 하나 더 만든다.(go lang 구조)

그런뒤에  /goStudy github의 레파지토리를 디렉토리로 만들어준다.

home>go>src>ace-t>goStudy dir이 만들어졌다면 이 안에서 git clone을 해준다.

ex) terrypark@MacBook-Pro:~/go/src/ace-t/goStudy$ git clone https://github.com/ace-t/goStudy.git

아래처럼 .git과 README.md가 보일 것이다.


이제! 대망의 소스를 코딩 해 보자! 필자는 지인분이 추천해준 해당 사이트를 따라해보려고 합니다.(https://mingrammer.com/gobyexample/)

먼저 go 파일을 하나 만들어줍니다.

terrypark@MacBook-Pro:~/go/src/ace-t/goStudy/goStudy$ vi hello-world.go

아래와 같이 소스를 코딩합니다.

package main

import "fmt"

func main() {

        fmt.Println("hello world")

}


실행해봅니다.

terrypark@MacBook-Pro:~/go/src/ace-t/goStudy/goStudy$ go run hello-world.go

hello world


이제~~위의 사이트에서 문법을 차근차근 해보면 되겠습니다.

어느정도 문법이 익숙해지면 좀 더 들어가보도록 하겠습니다.

ace-t github : https://github.com/ace-t/goStudy/tree/develop

github을 많이 사용하도록 해봐야겠습니다. ㅎㅎ

  - 끝 -




'Language > go lang' 카테고리의 다른 글

golang 정리  (0) 2017.05.18
GOROOT와 GOPATH  (0) 2017.04.27
go land에서 formatting 설정하기  (0) 2017.04.26
go lang Tip.  (0) 2017.02.15
go lang - fresh를 사용해 보자.  (0) 2017.02.15
go lang을 해보자.  (0) 2017.02.03

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바