반응형

[Go] set timezone

개발/Go 2016. 6. 28. 15:28
반응형

클라에서 서버로 시간값을 파라미터로 넘길때나, 서버의 경우 시간값을 상당히 중요시 하기 때문에,

특정 상황에 맞게 timezone변경을 하여야 한다.


외부 라이브러리를 사용하면 좀 더 깔끔하게 변환을 할 수 있겠지만,

귀찮은 관계로.. native 코드로 아래와 같이 구현을 할 수 있다.

아래 코드는 KST(한국시간 UTC+09:00)로 변환하는 과정을 설명하고 있다.

func main() {
    t := time.Now().UTC()    // UTC기준 현재 시간을 가져온다.
    t = t.In(time.FixedZone("KST", 9*60*60)) // 9시간을 더하고, KST라고 부른다.
    t.Format("2006-01-12 15:04:05")   // yyyy-MM-dd HH:mm:ss 형태로 formatting한다. (선택)
}


golang의 경우 따로 특정 타임존에 대한 템플릿이 없고, 위와 같이 만들어 낼 수가 있는 게 특이했고,

String Formatting도 다른 언어는 yyyy-MM-dd 이런식으로 패턴을 적어주어야 하는데, 그냥 숫자만 대충 넣어주면 알아서 바꿔준다.


반응형

'개발 > Go' 카테고리의 다른 글

[Go] func 가변인자(dynamic arguments) 전달  (0) 2016.06.28
[Go] XML Marshal / UnMarshal  (0) 2016.06.28
[Go] SyntaxHighlighter  (0) 2016.06.28
[Go] LumberJack for Logging  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
,
반응형

fmt에서 출력하는 콘솔 로그와, log에서 출력하는 파일 로그를 동시에 찍고 싶은 경우가 생겨서,

Printf를 하나의 function으로 만들어서 사용하기로 결정했다.


Printf는 string format과 가변인자를 전달받을 수 있도록 구성되어 있다.

func Printf(format string, v ...interface{}) {
     ...
}


Java의 경우 가변인자를 전달할때 변수명만 넘겨주면, 제대로 동작을 했었기에

아래와 같이 만들어보았다.

func logging(format string, v ...interface{}) {
    fmt.Printf(format, v)
    log.Printf(format, v)
}


테스트를 해본결과 변수 여러개를 넘겼을 경우, 가변인자의 0번째 값만 전달이 되는 현상이 발생을 하였다.


golang에서는 가변인자 전달 시에는 아래와 같이 전달해주는 function에도 ... 를 붙여서 사용해야 한다고 한다.

func logging(format string, v ...interface{}) {
    fmt.Printf(format, v...)
    log.Printf(format, v...)
}


다시 테스트를 해보니, 원하는대로 동작한다.

반응형

'개발 > Go' 카테고리의 다른 글

[Go] set timezone  (0) 2016.06.28
[Go] XML Marshal / UnMarshal  (0) 2016.06.28
[Go] SyntaxHighlighter  (0) 2016.06.28
[Go] LumberJack for Logging  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
,
반응형

간단하게 API 호출을 하는 프로그램을 개발해달라는 요청이 있어서, 고민하던 중 Windows / Linux 둘다 돌아가야 하겠고,

여러번 귀찮게 작업 안할 수 있고, 심플하게 개발할 수 있는 Go lang을 선택했다.


다만, 구시대 유물과 같은 XML 기반 서버와의 통신을 해야되는 상황이라, 마샬링과 언마샬링에서 삽질을 조금 했다.


1. Marshal

아래와 같은 데이터를 마샬링할 예정이다.



    aaaaa

    eeee



struct를 생성할 때, 생성할 xml에 대한 meta정보를 넣어주는 것만으로 가능하다. 

package main

import (
	"encoding/xml"
	"fmt"
)

type test struct {
	XMLName xml.Name `xml:"test"`
	Abc     abc      `xml:"abc"`
	Eee     string   `xml:"eee"`
}

type abc struct {
	Key   string `xml:"name,attr"`
	Value string `xml:",chardata"`
}

func main() {
	a := &abc{Key: "tester", Value: "aaaaa"}
	v := &test{Abc: *a, Eee: "eeee"}

	output, err := xml.Marshal(v)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(string(output))
}


2. UnMarshal

위에 만든 데이터를 그대로, 언마샬링 해본다.

package main

import (
	"encoding/xml"
	"fmt"
)

type test struct {
	XMLName xml.Name `xml:"test"`
	Abc     abc      `xml:"abc"`
	Eee     string   `xml:"eee"`
}

type abc struct {
	Key   string `xml:"name,attr"`
	Value string `xml:",chardata"`
}

func main() {
	a := &abc{Key: "tester", Value: "aaaaa"}
	v := &test{Abc: *a, Eee: "eeee"}

	output, err := xml.Marshal(v)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(string(output))

	var t test
	err = xml.Unmarshal(output, &t)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(t)
}


attr, chardata 등을 잘 활용하면, xml 데이터를 손쉽게 다룰 수 있는 것 같다.

추가로 xml.Name이 struct 변수에서 생략된 경우, struct Name으로 자동인식하게 된다.

반응형

'개발 > Go' 카테고리의 다른 글

[Go] set timezone  (0) 2016.06.28
[Go] func 가변인자(dynamic arguments) 전달  (0) 2016.06.28
[Go] SyntaxHighlighter  (0) 2016.06.28
[Go] LumberJack for Logging  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
,

[Go] SyntaxHighlighter

개발/Go 2016. 6. 28. 10:32
반응형

최신버전의 SyntaxHighlighter가 golang을 지원하지 않았다.


하지만, 역시 누군가 만들어둔게 있어서 이걸 스크립트 부분에 붙여넣으니 잘 동작을 했다.


/**
 * SyntaxHighlighter
 * http://alexgorbatchev.com/SyntaxHighlighter
 *
 * SyntaxHighlighter is donationware. If you are using it, please donate.
 * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
 *
 * @version
 * 3.0.83 (July 02 2010)
 *
 * @copyright
 * Copyright (C) 2004-2010 Alex Gorbatchev.
 *
 * @license
 * Dual licensed under the MIT and GPL licenses.
 */
;(function()
{
    // CommonJS
    typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
 
    function Brush()
    {
        var funcs   =   'make';
 
        var keywords =  'break case chan const continue default defer else fallthrough for func go ' +
                        'goto if import interface map package range return select struct switch type var ';
 
        this.regexList = [
            { regex: SyntaxHighlighter.regexLib.singleLineCComments,    css: 'comments' },          // one line comments
            { regex: SyntaxHighlighter.regexLib.multiLineCComments,     css: 'comments' },          // multiline comments
            { regex: SyntaxHighlighter.regexLib.doubleQuotedString,     css: 'string' },            // double quoted strings
            { regex: SyntaxHighlighter.regexLib.singleQuotedString,     css: 'string' },            // single quoted strings
            { regex: /^var \w+/g,                                       css: 'variable' },          // variables
            { regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi,             css: 'value' },         // numbers
            { regex: new RegExp(this.getKeywords(funcs), 'gmi'),        css: 'functions' },         // common functions
            { regex: new RegExp(this.getKeywords(keywords), 'gm'),      css: 'keyword' }            // keyword
            ];
 
        this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);
    };
 
    Brush.prototype = new SyntaxHighlighter.Highlighter();
    Brush.aliases   = ['golang'];
 
    SyntaxHighlighter.brushes.Golang = Brush;
 
    // CommonJS
    typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
})();


위 구문을 <script></script> 부분에 추가한 후,

<pre class="brush:golang"></pre> 이런식으로 사용을 하면 된다.


물론 위 구문을 그대로 복사해서 .js 파일로 만든 후, 업로드하여 script부분에서는 src에 파일 경로를 넣어 참조하게끔하는 방법이 훨씬 간단하다.

(회사라 파일 업로드가 안되는 관계로...)


반응형

'개발 > Go' 카테고리의 다른 글

[Go] func 가변인자(dynamic arguments) 전달  (0) 2016.06.28
[Go] XML Marshal / UnMarshal  (0) 2016.06.28
[Go] LumberJack for Logging  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
[Go] 간단한 채팅 서버  (0) 2016.06.11
,
반응형

간단하게 http post 통신을 하는 프로그램을 작성하던 도중, 로그 로테이트 정도는 필요하겠다 싶어서, 찾아봤더니

LumberJack이라는 훌륭한 오픈소스가 있었다. (https://github.com/natefinch/lumberjack)


External Library이기 때문에, 설치를 해주어야 한다.


1. 설치

$ go get gopkg.in/natefinch/lumberjack.v2


2. 사용법

import "log"
import "gopkg.in/natefinch/lumberjack.v2"

func main() {
        log.SetOutput(&lumberjack.Logger{
		Filename:   "./logs/test.log",   // 경로
		MaxSize:    500, // Megabytes단위
		MaxBackups: 3, // MaxAge에 의해서 지워져도, 몇개까지 파일을 유지할지 (이게 필요한가 싶기도함;;)
		MaxAge:     30, // 며칠동안 유지할지
	})
}


Go가 대세라 그런지, 기존 언어에서 썼던 라이브러리나 알고리즘을 검색하면,

정말 많이 나오는거 같아서 이질감이 없어서 좋은거같다.

반응형

'개발 > Go' 카테고리의 다른 글

[Go] func 가변인자(dynamic arguments) 전달  (0) 2016.06.28
[Go] XML Marshal / UnMarshal  (0) 2016.06.28
[Go] SyntaxHighlighter  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
[Go] 간단한 채팅 서버  (0) 2016.06.11
,
반응형

Go가 대세라길래 튜토리얼이나 해보자하고, 시작하던 찰나에

IDE는 뭐가 좋을까!? 검색해보니 Sublime Text가 가장 낫다고 하여, 개발환경 세팅부터해서 제대로 해보기로 하고 

시작했는데, 하루종일 삽질을 하다가, 퇴근 시간 1시간 전에 극적으로 해결해서 글로 남겨놓음.


Windows는 64비트 환경이고, Go Lang은 최신버전을 사용해도 상관없음.


1. Go Lang 설치 (http://golang.org/)

 - 설명이랄 것도 없음. 그냥 다운받아서 더블클릭. 끝

 - 환경변수 정도는 알아서 잡아주어야 함.


2. Sublime Text 3 설치

 - 1번과 마찬가지. (사용자 폴더명에 한글이 포함되어 있는 분은 Portable 사용을 권장.. 띄어쓰기, 한글에 굉장히 민감한 툴임)


3. Sublime Text 3에서의 Package Control 설치

  - Package Control 공식 홈에 Console열어서 설치하라고 가이드 되어 있는데, 잘 안된다.

  - Preference -> Browser Packages로 탐색기를 열고,  Packages 폴더로 이동해서 git으로 바로 clone받는다. 아래 명령어 입력

  - git clone https://github.com/wbond/sublime_package_control.git "Package Control"

  - Sublime Text 3를 재시작 하면, Pakcage Control 설치 완료


4. GoSublime 설치 (https://github.com/DisposaBoy/GoSublime)

 - Ctrl + Shift + P를 누르고, Package Control : Install Package를 선택하여, GoSublime을 선택하면 설치가 완료됨.

 - 위에 명시된 GitHub에서는 여기까지만 하면 제대로 될거다라고 설명을 하고 있는데, 내 컴에서는 Margo가 없다고 빌드를 못하겠다고 해서, Issue를 검색해보니, 수동으로 빌드를 하면 해결이 된다고 한다. (https://github.com/DisposaBoy/GoSublime/issues/445)

난, 이거 읽고도 한참 헤맸으니, 정리해보는걸로..


5. Margo 수동 빌드

 - ST3 ROOT\Data\Packages\GoSublime\src폴더에 보면 gosubli.me 폴더가 있는데, 얘를 GOROOT\src로 옮겨준다.

 - 옮긴 폴더에 들어가보면 margo, something-borrowed 폴더가 있는데, something-borrowed 폴더에서 cmd창을 열고, gocode폴더로 이동 후 go build -> go install 순으로 입력해 준다. (에러가 발생하는 경우, 대부분 환경변수 문제이므로 알아서 해결한다.)

 - something-borrowed\types 폴더에 가서도 go build -> go install 입력.

 - 이제 다시 gosubli.me 폴더에 가서, margo 폴더로 이동 후, go build를 입력하면, Margo.exe 파일이 생성된다.

 - 해당 파일을 이름을 바꾸어 주어야 하는데, ST3 에서 발생했던 로그를 View - Console을 열어서 잘 보면, Margo 어쩌고 하는 exe파일이 없다고 나오는게 원인인데, 지금까지 했던 작업이 그 파일을 수동으로 빌드해서 넣는 과정이었으므로, 파일명을 에러 로그에서 없다고 찍힌 파일명으로 변경해준다.

 - 해당 파일을 ST3 ROOT\Data\Packages\User\GoSublime\windows-x64\bin\ 경로에, 방금 exe파일을 옮겨준다.

 - ST3 재시작


참고로 ST2에서는 뭐가 문젠지 잘 안된다. Beta버전인 ST3보다 못한 것 같다.

반응형

'개발 > Go' 카테고리의 다른 글

[Go] func 가변인자(dynamic arguments) 전달  (0) 2016.06.28
[Go] XML Marshal / UnMarshal  (0) 2016.06.28
[Go] SyntaxHighlighter  (0) 2016.06.28
[Go] LumberJack for Logging  (0) 2016.06.28
[Go] 간단한 채팅 서버  (0) 2016.06.11
,
반응형

https://github.com/Seseong-Jang/simple_go_tcp_chat

 

튜토리얼 한 번 쭉 해보고, 이틀정도 걸려서 만들면서 느낀거지만.

고루틴이랑 채널의 연계는 어마어마한것 같다.


이것만으로 멀티쓰레드 형태의 프로그램이 가능하다니;;


단점은, 이건 C에서도 그랬었겠지만 string compare가 불편하고, string concat도 불편하다;

하지만 대안으로 go에서 패키지 형태로 지원하는게 있어서 다행임.


string concat은 bytes.Buffer의 writeString으로 처리하고,

compare는 strings 패키지를 이용하여 처리하였음. (물론 native로 구현하는게 넘사벽으로 빠르다고하긴함)


list같은 경우에도 iteration하면서 안에 값을 변경하면 list안에 들어있는 값도 변경될줄 알았는데

변경이 안되던.. 난 분명히 포인터로 집어넣었는데;; pushBack하는 순간의 객체 상태만 유지한다.


변경이 필요없이 유지해야할 정적인 항목들을 이용할 때만 사용해야 될 것 같다.

메소드에서 nil (go에서 null이라 칭하는) 반환도 안된다!

그래서 리턴 값이 객체라면 생성자 한번 돌려서 이상한 값들 넣은다음에 예외처리할 때 그 값으로 활용해야함.


하지만, strings의 hasPrefix이 함수는 정말 맘에든다.


전체 채팅, 귓속말, 채널 채팅, 닉네임 중복 유저 접속 차단 정도의 기능만 구현되어 있음.

반응형

'개발 > Go' 카테고리의 다른 글

[Go] func 가변인자(dynamic arguments) 전달  (0) 2016.06.28
[Go] XML Marshal / UnMarshal  (0) 2016.06.28
[Go] SyntaxHighlighter  (0) 2016.06.28
[Go] LumberJack for Logging  (0) 2016.06.28
[개발환경] Go + SubLimeText 3 + GoSublime  (0) 2016.06.11
,
반응형