.JSON 설정파일 읽어오기

.JSON 설정파일 읽어오기

github에 코드를 작성하는데 db의 중요한 설정값을 공개할 수는 없기 때문에 설정파일만 따로 보관해야 한다. 자금이 있어서 private github 서비스를 사용할 수도 없는 입장이고, 개인 개발자의 한계.

GO RESTFUL 서브를 만드려고 하는데 설정 파일을 json으로 저장하고, 이를 필요할 때 불러오는 코드를 작성하려고 한다.

go-mssqldb 패키지를 사용해서 microsoft sql server에 접속을 해서 이를 쏴주는 기능을 사용하려고 한다.

우선 저는 아래와 같은 구조를 갖는 setting.json 을 만드려고 합니다.

setting.json

{
    "database": "sqlserver",
    "user":{
        "id":"admin",
        "pwd":"123456789a!"
    },
    "host":{
        "address": "222.111.111.111",
        "port": 1433
    }
}

이제 이를 golang 에 맞는 type struct를 만듭니다.

type config struct

type MssqlConnect struct {
	Database string `json:"database"`
	User struct {
		ID  string `json:"id"`
		Pwd string `json:"pwd"`
	} `json:"user"`
	Host struct {
		Address string `json:"address"`
		Port    int    `json:"port"`
	} `json:"host"`
}

Load Config

다음은 config.json 파일을 읽어오는 과정입니다.

func LoadConfig() (string, error){
	var config MssqlConfig
	file, err := os.Open("setting.json")
	defer file.Close()
	if err != nil {
		Log.Fatal(err)
	}
	decoder := json.NewDecoder(file)
	err = decoder.Decode(&config)
	if err != nil {
		Log.Fatal(err)
	}
	return config, err
}

func main

아래와 같이 사용하면 됩니다.

func main() {
  config, err := LoadConfig()
  fmt.Println(config.Database) // sqlserver
  fmt.Println(config.User.ID) // admin
}
블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

고랭 1.9 업데이트

Golang 2017. 9. 6. 02:06

golang 1.9

golang 1.9 release news

소개

최신 Go 버전 1.9 버전은 Go 1.8 이후 6 개월 후에 출시되고, Go 1.x 시리즈에서 10 번째 릴리스입니다. 언어에는 두 가지 변경 사항이 있습니다.
type alias에 대한 지원 추가 및 구현이 부동 소수점 연산을 통합 할 수 있는 시점 정의하는 부분입니다. 대부분의 변경 사항은 toolchain, runtime 및 라이브러리의 구현에 있습니다. 언제나 그렇듯이 이 릴리스는 Go 1 호환성을 유지합니다. 거의 모든 Go 프로그램이 이전처럼 계속해서 컴파일되고 실행될 것입니다.

이 릴리스에서는 명쾌한 단조로운 시간 지원 기능을 추가하고, 패키지 내의 기능 컴파일을 병렬화하며 test helper 기능을 보다 잘 지원하고 새로운 비트 조작 패키지를 포함하며, 새로운 동시 map type을 제공합니다.

오늘 brew update를 했더니 golang이 업그레이드가 된 사실을 알게 되었습니다. 그래서 중요한 변경부분을 적어 봅니다.

언어의 변경점

두가지 변경점이 있습니다.

Go는 패키지간에 유형을 이동하면서 점진적인 코드 복구를 지원하는 type alias을 지원합니다. type 디자인 문서리팩토링에 대한 기사에서 문제를 자세히 설명합니다. 즉, type alias 선언은 다음과 같은 형식을 취합니다.

type T1 = T2

이 선언은 T2로 표시된 type에 대한 대체 철자 인 alias T1을 도입합니다. 즉, T1과 T2는 모두 같은 type을 나타냅니다.

언어의 작은 변경점은 아키텍처의 “fused multiply and add”(FMA) 명령어를 사용하여 중간 결과를 반올림하지 않고, x*y+z를 계산하는 것과 같이 부동 소수점 연산을 함께 구현할 수 있는 언어구현을 의미합니다 x * y. 강제적으로 중간의 반올림을 실시하려면, float64 (x * y) + z라고 기입합니다.

Ports

이 릴리스에는 지원되는 새로운 운영 체제 또는 프로세서 아키텍처가 없습니다.

ppc64x requires POWER8

FreeBSD

OpebBSD 6.0

known Issue

NetBSD 커널 충돌로 인해 1.9 개발동안 NetBSD 빌더 실행이 중단되었습니다 (NetBSD 7.1까지 포함). Go 1.9가 릴리스됨에 따라 NetBSD 7.1.1이 수정되었습니다. 그러나 현재로서는 테스트 통과 한 NetBSD 빌더가 없습니다. 다양한 NetBSD 문제를 조사하는 데 도움을 주시면 감사하겠습니다.

Tools

병렬 컴파일

Go 컴파일러는 이제 다중 코어를 활용하여 패키지의 함수를 병렬로 컴파일하는 기능을 지원합니다. 이것은 별도 패키지의 병렬 컴파일에 대한 go 명령의 기존 지원에 추가됩니다. 병렬 컴파일은 기본적으로 켜져 있지만 환경 변수를 아래와 같이 변경하면 비활성화 할 수 있습니다.

GO19CONCURRENTCOMPILATION = 0

Vendor matching with ./…

Moved GOROOT

Compiler Toolchain

어샘블러

Doc

긴 인수 목록들이 생략됩니다. 이 것은 go doc 의 가독성을 개량했습니다.
구조체 필드에 대한 문서보기가 지원됩니다. 예를 들어 doc http.Client.Jar로 이동하십시오.

type Client struct {
    // Jar specifies the cookie jar.
    //
    // The Jar is used to insert relevant cookies into every
    // outbound Request and is updated with the cookie values
    // of every inbound Response. The Jar is consulted for every
    // redirect that the Client follows.
    //
    // If Jar is nil, cookies are only sent if they are explicitly
    // set on the Request.
    Jar CookieJar

    // ... other fields elided ...

ENV

go env --json을 통해 json 형식으로 출력할 수 있습니다.

Test

Pprof

Vet

vet명령은 go tool에 더 잘 통합되어 있어서 vet는 모든 표준 빌드 플래그를 지원하고, vet 플래그는 이제 vet와 go tool vet에서 사용할 수 있습니다.

Gccgo

Runetime

inlined frames이 포함된 스택호출

성능

언제나 그렇듯이 변경 사항은 매우 일반적이며 다양하여 성능에 대한 정확한 설명을 하기 어렵습니다. 대부분의 프로그램은 가비지 컬렉터의 속도 향상, 향상된 코드 생성 및 코어 라이브러리의 최적화로 인해 조금 더 빠르게 실행될 것입니다.

가비지 콜렉터(Garbage Collector)

세계 표준 가비지 콜렉션을 트리거하는데 사용 된 라이브러리 함수는 이제 동시 가비지 콜렉션을 트리거합니다. 특히 runtime.GC, debug.SetGCPercent 및 debug.FreeOSMemory는 동시 가비지 콜렉션을 트리거하고, 가비지 콜렉션이 완료 될 때까지 호출 goroutine 만 차단합니다.

debug.SetGCPercent 함수는 새로운 GOGC 값으로 인해 즉시 필요한 경우에만 가비지 수집을 트리거합니다. 이렇게하면 GOGC를 즉석에서 조정할 수 있습니다.

큰 오브젝트 할당 성능은 대형 오브젝트가 많은 대형 (> 50GB) 힙을 사용하는 어플리케이션에서 상당히 향상됩니다.

매우 큰 힙에 대해서도 runtime.ReadMemStats 함수는 이제 100μs보다 적게 걸립니다.

코어 라이브러리

새로운 비트조작 패키지

Go 1.9에는 새로운 패키지 인 math/bits가 포함되어 있으며 비트 조작을위한 최적화 된 구현이 포함되어 있습니다. 대부분의 아키텍처에서이 패키지의 함수는 컴파일러에서 추가로 인식되며 추가 성능을 위해 내장 함수로 처리됩니다.

Test.Helper function

새로운 (T).Helper( B).Helper 메서드는 호출 함수를 테스트 도우미 함수로 표시합니다. 파일 및 줄 정보를 인쇄 할 때 해당 기능은 건너 뜁니다. 이렇게하면 사용자에게 유용한 줄 번호를 사용하면서 테스트 도우미 함수를 작성할 수 있습니다.

동시 발생하는 MAP

sync 패키지의 새로운 map 패키지는 amortized-constant-time, 저장 및 삭제가 포함 된 동시 map입니다. 여러 goroutine이 Map의 메소드를 동시에 호출하는 것이 안전합니다.

Profiler Labels

기타 소규모 변경점

문서가 너무 많다… ㅠㅠ

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

이번에 1.7로 업그레이드를 한 후에 go build 를 사용해 봤더니

/usr/local/go/src/runtime/os_linux.go:27 _FUTEX_WAIT redeclared in this block
…

과 같은 에러가 났습니다.
이럴 때에는 전에 설치했던 버전의 찌꺼기가 남아 있기 때문이기 당황해 하지 마시고,

rm -rf /usr/local/go

명령어를 사용해서 삭제하고 다시 새로 설치하면 됩니다.

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

golang | strings 패키지

Golang 2016. 8. 12. 10:10
이거 뭐 한글로 되어 있는 곳이 안 보인다.

strings 패키지

import "strings"

문자열 조작을위한 간단한 함수를 모은 패키지입니다.

Contains 함수

func Contains (s, substr string) bool

Contains는 s에 substr가있을 때 true를 돌려줍니다.

Count 함수

func Count (s, sep string) int

Count는 s 내의 sep의 고유 한 개수를 계산합니다.

Fields 함수

func Fields (s string) [] string

Fields는 문자열 s를 하나 이상의 연속 된 공백으로 분리하여 s의 부분 문자열 배열을 반환합니다. s에 공백 만 포함되어 있지 않은 경우는 빈리스트를 반환합니다.

FieldsFunc 함수

func FieldsFunc (s string, f func (int) bool) [] string

FieldsFunc는 함수 f (c)가 true를 돌려주는 (c는 Unicode 코드 포인트) 위치에서 문자열 s를 분할하고 s 조각의 배열을 돌려줍니다. f (c)가 true를 반환하는 코드 포인트가 s 내에 없었던 경우는 하늘의 조각이 반환됩니다.

HasPrefix 함수

func HasPrefix (s, prefix string) bool

HasPrefix 문자열 s의 시작 부분이 prefix와 일치하는지 테스트합니다.

HasSuffix 함수

func HasSuffix (s, suffix string) bool

HasSuffix 문자열 s의 끝 부분이 suffix과 일치하는지 테스트합니다.

Index 함수

func Index (s, sep string) int

Index는 s에서 sep가 최초로 출현하는 위치의 인덱스를 돌려줍니다. 일치하지 않는 경우는 -1을 돌려줍니다.

IndexAny 함수

func IndexAny (s, chars string) int

IndexAny는 s에서 chars의 Unicode 코드 포인트 중 하나가 최초로 출현하는 위치의 인덱스를 돌려줍니다. 어떤 Unicode 코드 포인트도 일치하지 않는 경우는 -1을 돌려줍니다.

IndexFunc 함수

func IndexFunc (s string, f func (r int) bool) int

IndexFunc는 s에서 f (c)를 충족 최초의 Unicode 코드 포인트의 인덱스 또는 찾지 못한 경우 -1을 반환합니다.

IndexRune 함수

func IndexRune (s string, rune int) int

IndexRune는 s에서 Unicode 코드 포인트 rune가 최초로 출현하는 위치의 인덱스를 돌려줍니다. 일치하지 않는 경우는 -1을 돌려줍니다.

Join 함수

func Join (a [] string, sep string) string

Join 매개 변수 a의 요소를 결합하여 새로운 문자열을 만듭니다. sep에 지정된 구분 기호가 결합 될 때 요소 사이에 삽입됩니다.

LastIndex 함수

func LastIndex (s, sep string) int

LastIndex는 s에서 sep가 마지막에 출현하는 위치의 인덱스를 돌려줍니다. 일치하지 않는 경우는 -1을 돌려줍니다.

LastIndexAny 함수

func LastIndexAny (s, chars string) int

LastIndexAny는 chars의 Unicode 코드 포인트 중 하나가 s에서 나타나는 마지막 위치의 인덱스를 돌려줍니다. chars의 어느 Unicode 코드 포인트도 s에 존재하지 않으면 -1을 반환합니다.

LastIndexFunc 함수

func LastIndexFunc (s string, f func (r int) bool) int

LastIndexFunc는 s에서 f (c)를 충족 마지막 Unicode 코드 포인트의 인덱스 또는 찾지 못한 경우 -1을 반환합니다.

Map 함수

func Map (mapping func (rune int) int, s string) string

Map은 문자열 s 내의 모든 문자를 매핑 함수에 의해 변환 해, 그 결과를 새로운 문자열로 반환합니다. 매핑 함수가 마이너스 값을 반환하면 해당 문자를 대체없이 파기됩니다.

Repeat 함수

func Repeat (s string, count int) string

Repeat 문자열 s를 매개 변수 count에 지정한 횟수 복사 한 새로운 문자열을 반환합니다.

Replace 함수

func Replace (s, old, new string, n int) string

Replace는 문자열 s의 복사본에 처음 n, old 부분을 new로 바꾸 (중복 없음) 한 것을 돌려줍니다. n <0 일 때 대체 무제한입니다.

Split 함수

func Split (s, sep string, n int) [] string

Split은 s를 sep를 구분하는 부분 문자열 슬라이스 분리기 사이의 부분 문자열 조각을 반환합니다. sep가 비어있을 때, Split은 UTF-8 시퀀스 단위로 분할합니다. n은 반환 된 부분 문자열의 수를 결정합니다.

n> 0 : 최대 n 개의 부분 문자열. 마지막 부분 문자열에는 분할되지 않은 나머지가 포함된다.
n == 0 : 결과는 ni​​l. (부분 문자열 없음)
n <0 : 모든 부분 문자열.

SplitAfter 함수

func SplitAfter (s, sep string, n int) [] string

SplitAfter는 s에서 sep가 나타난 부분의 바로 슬라이스하고, 이러한 부분 문자열 조각을 반환합니다. sep가 비어있을 때, SplitAfter UTF-8 시퀀스 단위로 분할합니다. n은 반환 된 부분 문자열의 수를 결정합니다.

n> 0 : 최대 n 개의 부분 문자열. 마지막 부분 문자열에는 분할되지 않은 나머지가 포함된다.
n == 0 : 결과는 ni​​l. (부분 문자열 없음)
n <0 : 모든 부분 문자열.
Title 함수
func Title (s string) string

Title 문자열 s 단어의 처음 Unicode 문자를 타이틀 케이스에지도 한 카피를 돌려줍니다.

ToLower 함수

func ToLower (s string) string

ToLower는 문자열 s를 Unicode의 문자에 매핑 된 복사본을 반환합니다.

ToLowerSpecial 함수

func ToLowerSpecial (_case unicode.SpecialCase, s string) string

ToLowerSpecial는 준 SpecialCase 규칙을 우선적으로 사용하여 문자열 s를 Unicode의 문자에 매핑 된 복사본을 반환합니다.

ToTitle 함수

func ToTitle (s string) string

ToTitle는 문자열 s를 Unicode의 타이틀 케이스에 매핑 된 복사본을 반환합니다.

ToTitleSpecial 함수

func ToTitleSpecial (_case unicode.SpecialCase, s string) string

ToTitleSpecial는 준 SpecialCase 규칙을 우선적으로 사용하여 문자열 s를 Unicode의 타이틀 케이스에 매핑 된 복사본을 반환합니다.

ToUpper 함수

func ToUpper (s string) string

ToUpper는 문자열 s를 Unicode의 대문자로 맵핑 된 복사본을 반환합니다.

ToUpperSpecial 함수

func ToUpperSpecial (_case unicode.SpecialCase, s string) string

ToUpperSpecial는 준 SpecialCase 규칙을 우선적으로 사용하여 문자열 s를 Unicode의 대문자로 맵핑 된 복사본을 반환합니다.

Trim 함수

func Trim (s string, cutset string) string

Trim은 cutset에 포함 된 Unicode 코드 포인트를 문자열 s의 시작과 끝에서 모두 삭제 한 조각을 반환합니다.

TrimFunc 함수

func TrimFunc (s string, f func (r int) bool) string

TrimFunc은 f (c)를 충족 Unicode 코드 포인트 c 문자열 s의 시작과 끝에서 모두 삭제 한 조각을 반환합니다.

TrimLeft 함수

func TrimLeft (s string, cutset string) string

TrimLeft은 cutset에 포함 된 Unicode 코드 포인트를 문자열 s의 선두에서 삭제 한 조각을 반환합니다.

TrimLeftFunc 함수

func TrimLeftFunc (s string, f func (r int) bool) string

TrimLeftFunc은 f (c)를 충족 Unicode 코드 포인트 c 문자열 s의 선두에서 삭제 한 조각을 반환합니다.

TrimRight 함수

func TrimRight (s string, cutset string) string

TrimRight는 cutset에 포함 된 Unicode 코드 포인트를 문자열 s의 끝에서 삭제 한 조각을 반환합니다.

TrimRightFunc 함수

func TrimRightFunc (s string, f func (r int) bool) string

TrimRightFunc은 f (c)를 충족 Unicode 코드 포인트 c 문자열 s의 끝에서 삭제 한 조각을 반환합니다.

TrimSpace 함수

func TrimSpace (s string) string

TrimSpace 문자열 s의 시작과 끝에서 Unicode로 정의되고있는 공백을 제외 한 조각을 반환합니다.

Reader 형

Reader는 문자열에서 읽어들이는 Read, ReadByte, ReadRune 함수를 제공합니다.

type Reader string

NewReader 함수

func NewReader (s string) * Reader

NewReader는 s에서로드 할 새로운 Reader를 돌려줍니다. 이것은 bytes.NewBufferString과 거의 동일하지만, 더 효율적이며 또한 읽기 밖에 할 수없는 점이 다릅니다.

(* Reader) Read 함수

func (r * Reader) Read (b [] byte) (n int, err os.Error)

(* Reader) ReadByte 함수

func (r * Reader) ReadByte () (b byte, err os.Error)

(* Reader) ReadRune 함수

func (r * Reader) ReadRune () (rune int, size int, err os.Error)

ReadRune 버퍼에서 다음 UTF-8 인코딩 된 Unicode 코드 포인트를 읽어 들여 돌려줍니다. 로드 바이트 데이터가 없을 때는 os.EOF 오류가 반환됩니다. 바이트 데이터가 잘못된 UTF-8 인코딩 인 경우는 1 바이트 건너 뛰고 U + FFFD 1을 반환합니다.

버그
Title에서 사용하는 단어 협회는 Unicode의 구두점을 제대로 다루지 않습니다.

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

Raspberry pi 3 B+ 에 Raspbian-jessie 가 설치되어 있습니다.

armv6l 용으로 이미 만들어 진 것이 있기 때문에 아주 쉽게 할 수 있습니다.

다운로드

$ wget https://storage.googleapis.com/golang/go1.6.3.linux-armv6l.tar.gz

/usr/local 에 압축을 풀어줍니다.

$ sudo tar -C /usr/local -xzf go1.6.3.linux-armv6l.tar.gz

다음에는 설정을 등록합니다.

PATH”:/usr/local/go/bin:$GOPATH/bin”

참조

sudo apt-get install golang 으로 설치 설정파일


GOARCH="arm"
GOBIN=""
GOCHAR="5"
GOEXE=""
GOHOSTARCH="arm"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/pi/golang"
GORACE=""
GOROOT="/usr/lib/go"
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_arm"
CC="gcc"
GOGCCFLAGS="-fPIC -marm -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"
pi@raspleaf:~ $ whereis go
go: /usr/bin/go /usr/lib/go /usr/share/go /usr/share/man/man1/go.1.gz

apt-get purge golang 을 하고 난 후에 직접 다운받고 난 뒤의 설정 파일

GOARCH="arm"
GOBIN=""
GOEXE=""
GOHOSTARCH="arm"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/pi/golang"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_arm"
GO15VENDOREXPERIMENT="1"
CC="gcc"
GOGCCFLAGS="-fPIC -marm -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"
pi@raspleaf:~ $ whereis go
go: /usr/local/go /usr/local/go/bin/go

혹시 설정이 달라질지 몰라서 한번 백업을해 놨습니다. 딱히 바뀌점이 없는 거 보니 제대로 설치가 된 것 같습니다.

그런데, 이상하게 db.sql 을 사용하는데, 1.3 보다 느립니다. 일부러 1.6 버전을 설치했는데, 느려지다니, 좀 실망입니다.

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

개발환경은 다른 곳에 라즈베리파이를 놓고, 다시 다른 곳에서 golang을 통해서 접속을 하려고 합니다.

모든 초반 작업은 root 계정에서 합니다.

 $ mysql -u root -p

DB를 생성

MariaDB [(none)]> CREATE DATABASE test;
MariaDB [(none)]> flush privileges;

mysql 외부 접속을 위한 아이디 생성

를 통해 관리자 아이디로 mysql(mariaDB)에 접속을 하고, 계정을 생성합니다.

내부 접속용 아이디

MariaDB [(none)]> create user ‘이름’@‘localhost’ identified by ‘비밀번호’;
MariaDB [(none)]> flush privileges;

localhost 가 들어가 있으면 내부접속만 허용하는 옵션입니다.

외부 접속용 아이디

MariaDB [(none)]> create user '이름'@'%' identified by '비밀번호'
MariaDB [(none)]> flush privileges;

% 이 들어가면 모든 아이피의 접속을 허용한다는 뜻입니다.
특정 IP에 권한을 주려면 ‘123.123.123.123’ 과 같은 권한을 추가하면 됩니다.

DB 계정에 권한설정

grant all privileges on 디비명.* to 이름@'%' identified by ‘비밀번호';
MariaDB [(none)]> flush privileges;

mysql 설정하기

$sudo vi /etc/mysql/my.cnf

bind-address = 127.0.0.1설정의 맨 앞에 #을 넣어서 주석처리 합니다.

raspberry 에 mysql 포트 열기

mysql 기본포트는 3306를 사용하고 있습니다.
3306 포트를 열어줍니다.

$ iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
$ iptables -A OUTPUT -p tcp --dport 3306 -j ACCEPT
$ iptables-save

golang 소스

go get github.com/go-sql-driver/mysq;

를 통해서 소스 mysql 접속 소스를 다운받습니다. ($GOPATH) 폴더에 자동으로 설치가 됩니다.

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "아이디:비밀번호@tcp(접속주소:포트)/디비명")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    var version string
    db.QueryRow("SELECT VERSION()").Scan(&version)
    fmt.Println("Connected to:", version)
}

sql.Open(“mysql”, “아이디:비밀번호@tcp(접속주소:포트)/디비명”)
포트번호까지 전부 적어줘야 합니다.

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요