로그를 다루다 보면 java timstamp( 또는 unix timestamp)로 데이터를 검증해야 할 때가 있다.


하도 많아서 하나를 만들었다.


https://gist.githubusercontent.com/knight76/bbdb187fd0b6784fe810e1200f4ec2be/raw/8e82dd57e651352caf1d91e16b7dd618e6db56d1/ts2dt.go


package main

import (
    "fmt"
    "time"
    "strconv"
    "os"
)

func main() {
  fmt.Println(len(os.Args))
  if len(os.Args) == 1 {
    fmt.Println("----- usage")
    fmt.Println("ts2dt 0")
    fmt.Println("ts2dt 1570790541")
    return
  }

  if len(os.Args) > 2 {
    panic("error: only one timestmap")
  }

  ts := os.Args[1]

  i, err := strconv.ParseInt(ts, 10, 64)
  if err != nil {
    panic(err)
  }
  tm := time.Unix(i, 0)
  fmt.Println(tm)
}

// go build ts2dt.gio
// ./ts2dt 1570790541


'golang' 카테고리의 다른 글

go 언어의 gc 소개 자료.  (0) 2018.07.19
[golang] 고루틴(go routine) 예제  (0) 2017.09.08
[golang] 매개 변수 받기  (0) 2017.09.08
[golang] 에러(error) 예제  (0) 2017.09.07
[golang] defer 예제  (0) 2017.09.07
Posted by '김용환'
,

go 언어 gc 관련 소개 자료이다.


https://blog.golang.org/ismmkeynote



좋은 자료는 다음과 같다. 


http://www.cs.ucsb.edu/~ckrintz/racelab/gc/papers/ 에서 dijkstra의 tri-color 알고리즘(http://www.cs.ucsb.edu/~ckrintz/racelab/gc/papers/dijkstra-on-the-fly.pdf)


optimizing java 책


gc faq

https://www.iecc.com/gclist/GC-algorithms.html







'golang' 카테고리의 다른 글

ts2dt 타임스탬프를 날짜로 변경해주기  (0) 2019.10.11
[golang] 고루틴(go routine) 예제  (0) 2017.09.08
[golang] 매개 변수 받기  (0) 2017.09.08
[golang] 에러(error) 예제  (0) 2017.09.07
[golang] defer 예제  (0) 2017.09.07
Posted by '김용환'
,



golang에는 고루틴이라는 concurrency를 제공한다.


아래 예제는 한번에 동시에 실행하는 예제로서 클로져를 실행하는 코드이다.

 fmt.Scanln()은 입력을 기다리는 함수로서 고루틴이 모두 완료할 때까지 기다린다. 

package main

import (
"fmt"
"time"

)

func main() {
for i := 0; i <= 5; i++ {
go func() {
t := time.Now()
fmt.Println(t)
fmt.Println("Hello, World")
}()
}

fmt.Scanln()

}




결과는 다음과 같다.


2017-09-08 20:18:30.304976947 +0900 KST

Hello, World

2017-09-08 20:18:30.304985595 +0900 KST

Hello, World

2017-09-08 20:18:30.305044938 +0900 KST

Hello, World

2017-09-08 20:18:30.305051478 +0900 KST

Hello, World

2017-09-08 20:18:30.305007134 +0900 KST

Hello, World

2017-09-08 20:18:30.305108262 +0900 KST

Hello, World





runtime.GOMAXPROCS(n)은 프로세서를 얼마나 사용할지 cpu에 알린다.


package main

import (
"fmt"
"time"
"runtime"
)

func main() {
runtime.GOMAXPROCS(5)

//for i := 0; i <= 9000000 * 900000; i++ {
for i := 0; i <= 5; i++ {
go func() {
t := time.Now()
fmt.Println(t)
fmt.Println("Hello, World")
}()
}

fmt.Scanln()

}


cpu 모니터링을 해보면 확실히 알 수 있다.




모든 cpu를 활용하고 싶다면 runtime.NumCPU() 코드를 사용한다.

package main

import (
"fmt"
"time"
"runtime"
)

func main() {
fmt.Println(runtime.NumCPU())
runtime.GOMAXPROCS(runtime.NumCPU())

//for i := 0; i <= 9000000 * 900000; i++ {
for i := 0; i <= 5; i++ {
go func() {
t := time.Now()
fmt.Println(t)
fmt.Println("Hello, World")
}()
}

fmt.Scanln()

}



참고로 go 1.5부터는 rutnime.GOMAXPROCS()를 설정하지 않으면 모든 cpu를 사용하는 것이 디폴트이다.



다음은 channel 예제이다. channel은 go 루틴에서 사용되는 공용 변수이다. 

package main

import (
"fmt"
)

func multifly(value int, ch chan int) {
ch <- value * value
}

func main() {
channel := make(chan int)
go multifly(10, channel)
result := <-channel
fmt.Println(result)
}

채널(channel)을 생성하고 가지고 논 다음, 채널(channel) 값을 일반 변수에 저장한다. 



결과 값은 100이다.



참고로 multifly를 호출할 때 go를 사용하지 않으면 deadlock 에러가 발생한다.


fatal error: all goroutines are asleep - deadlock!



채널은

channel <- 값 : channel에 값 저장
x: <- channel : 채널에 값이 저장될 때까지 기다리고 x에 값을 할당한다. 



하지만 channel 값을 할당하지 않고 대기하는 의미로 쓰일 수도 있다. (예, 시그널)

package main


func multifly(value int, ch chan int) {
ch <- value * value
}

func main() {
channel := make(chan int)
go multifly(10, channel)
<-channel
}




채널에 2개의 버퍼를 사용하고 싶다면 다음과 같이 사용한다. 

buffer := make(chan bool, 2)



운영 체제 시그널을 고루틴으로 처리할 수 있다. 


package main

import (
"fmt"
"os/signal"
"os"
"syscall"
)

func main() {
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
sig := <-sigs
fmt.Println()
fmt.Println(sig)
done <- true
}()

fmt.Println("awaiting signal")
<-done
fmt.Println("exiting")
}


실행결과는 다음과 같다. 중간에 Ctrl+C(SIGINT)를 보내야 종료된다.



$ go run Test.go

awaiting signal

^D

^E

^C

interrupt

exiting

'golang' 카테고리의 다른 글

ts2dt 타임스탬프를 날짜로 변경해주기  (0) 2019.10.11
go 언어의 gc 소개 자료.  (0) 2018.07.19
[golang] 매개 변수 받기  (0) 2017.09.08
[golang] 에러(error) 예제  (0) 2017.09.07
[golang] defer 예제  (0) 2017.09.07
Posted by '김용환'
,


go언어에서 매개 변수를 받을 수 있다. 기본 값을 


package main

import (
"fmt"
"flag"
)

func main() {
id := flag.String("id", "iiiii", "aaaaa")
name := flag.String("name", "nnnnn", "bbbbb")

flag.Parse()
fmt.Println("id:", *id)
fmt.Println("name:", *name)
fmt.Printf("%v %v\n", *id, *name)
}



결과는 다음과 같다. 디폴트값을 넣은 효과가 발휘된다.


$ ./Test -id=1 -name=samuel

id: 1

name: samuel

1 samuel


$ ./Test  -name=samuel

id: iiiii

name: samuel

iiiii samuel



$./Test -id=1

id: 1

name: nnnnn

1 nnnnn




flag.PrintDefaults()와 flag.Args(), flag.Arg(i)에 대한 쓰임을 살펴본다. 


원하는 매개 변수가 정해지지 않았다면 flag.PrintDefaults()를 통해 flag.String()에서 정의된 내용이 나타나고,


flag.Args()는 주어진 매개 변수외 추가로 매개 변수가 주어졌다면 확인할 수 있는 api이다. 

package main

import (
"fmt"
"flag"
"os"
)

func main() {
id := flag.String("id", "iiiii", "aaaaa")
name := flag.String("name", "nnnnn", "bbbbb")

if *id == "" || *name == "" {
flag.PrintDefaults()
os.Exit(1)
}

flag.Parse()
fmt.Println("id:", *id)
fmt.Println("name:", *name)
fmt.Printf("%v %v\n", *id, *name)

fmt.Println(flag.Args())
fmt.Println(flag.Arg(0))


}


결과는 다음과 같다.



./Test -id=1 -name=samuel a b c

id: 1

name: samuel

1 samuel

[a b c]

a


'golang' 카테고리의 다른 글

go 언어의 gc 소개 자료.  (0) 2018.07.19
[golang] 고루틴(go routine) 예제  (0) 2017.09.08
[golang] 에러(error) 예제  (0) 2017.09.07
[golang] defer 예제  (0) 2017.09.07
[golang] interface(인터페이스) 예제  (0) 2017.09.06
Posted by '김용환'
,


go언어에서 에러 발생에 대한 예제이다.


숫자 1만 받고 나머지는 에러로 표현하는 예제이다. 함수 뒤에 (..., error)로 표현한다. 

fmt.Errorf를 사용한다 하더라도 실제로 Error를 출력하지 않는다. log.Fatal과 함께 표현해야 에러 로그를 출력한다. 


package main

import (
"fmt"
"log"
)

func main() {
checkOnly1(1)
checkOnly1(-1)
}

func checkOnly1(n int) {
result, err := only1(n)
fmt.Println("result of only1 call :", result)
if (err != nil) {
log.Fatal(err)
}
}

func only1(number int) (bool, error) {
if number == 1 {
return true, nil
}
return false, fmt.Errorf("%d != 1", number)
}



결과는 다음과 같다.


result of only1 call : true

result of only1 call : false

2017/09/07 14:18:06 -1 != 1

exit status 1




go 언어 예제를 보면 아래처럼 많이 사용한다. 

req, err := http.NewRequest("GET", "url", *tag), nil)





error 소스를 보면 다음과 같다. 어디든지 사용할 수 있는 interface이다. 


type error interface {
Error() string
}





패닉(panic)을 써보자.


package main

import (
"fmt"
"log"
)

func main() {
checkOnly1(1)
checkOnly1(-1)
}

func checkOnly1(n int) {
//
//defer func() {
// r := recover()
// fmt.Println(r)
//}()

result, err := only1(n)
fmt.Println("result of only1 call :", result)
if (err != nil) {
fmt.Println("before panic")
log.Panic(err)
}

fmt.Println("after panic")
}

func only1(number int) (bool, error) {
if number == 1 {
return true, nil
}
return false, fmt.Errorf("%d != 1", number)
}


결과는 다음과 같다.


에러(패닉)이 발생하면서 exit status가 2(serious problem)를 리턴했다. 

바로 종료되지 않고 main 함수 모든 내용이 실행되었다. 



2017/09/07 23:56:42 -1 != 1

result of only1 call : true

after panic

result of only1 call : false

before panic

panic: -1 != 1


goroutine 1 [running]:

log.Panic(0xc42003df00, 0x1, 0x1)

/usr/local/go/src/log/log.go:322 +0xc0

main.checkOnly1(0xffffffffffffffff)

/Users/samuel.kim/go/src/google/Test.go:24 +0x29f

main.main()

/Users/samuel.kim/go/src/google/Test.go:10 +0x37

exit status 2




defer를 사용해 패닉이 발생하더라도 얌전히(?) 종료시킬 수 있다. 


package main

import (
"fmt"
"log"
)

func main() {
checkOnly1(1)
checkOnly1(-1)
}

func checkOnly1(n int) {

defer func() {
r := recover()
fmt.Println(r)
}()

result, err := only1(n)
fmt.Println("result of only1 call :", result)
if (err != nil) {
fmt.Println("before panic")
log.Panic(err)
}

fmt.Println("after panic")
}

func only1(number int) (bool, error) {
if number == 1 {
return true, nil
}
return false, fmt.Errorf("%d != 1", number)
}


순서가 어그러졌지만 패닉을 잘 막았다. 


result of only1 call : true

2017/09/07 23:58:29 -1 != 1

after panic

<nil>

result of only1 call : false

before panic

-1 != 1





'golang' 카테고리의 다른 글

[golang] 고루틴(go routine) 예제  (0) 2017.09.08
[golang] 매개 변수 받기  (0) 2017.09.08
[golang] defer 예제  (0) 2017.09.07
[golang] interface(인터페이스) 예제  (0) 2017.09.06
[golang] 함수.클로져 예제  (0) 2017.09.06
Posted by '김용환'
,

[golang] defer 예제

golang 2017. 9. 7. 11:58


defer는 함수를 사용하면 해당 함수를 호출한 함수가 종료할 때 호출된다.


package main

import "fmt"

func main() {
s := [5]int{10, 20, 30, 40, 50}
for i, number := range s {
fmt.Println(i, number)
}

println("\nßdefer--")
for i, number := range s {
defer fmt.Println(i, number)
}
}



결과는 다음과 같다.


0 10

1 20

2 30

3 40

4 50

defer--

4 50

3 40

2 30

1 20

0 10



스택에 쌓인 것을 하나씩 종료 하는 것처럼 보인다.


보통 소켓을 정리할 때 많이 사용된다. 


defer resp.Body.Close()





'golang' 카테고리의 다른 글

[golang] 매개 변수 받기  (0) 2017.09.08
[golang] 에러(error) 예제  (0) 2017.09.07
[golang] interface(인터페이스) 예제  (0) 2017.09.06
[golang] 함수.클로져 예제  (0) 2017.09.06
[golang] 구조체 초기화/메소드 예제  (0) 2017.08.30
Posted by '김용환'
,

go의 interface는 OO개념이 아니다. struct에서 적당히 호출할 수 있는 형태로 만들어줄 수 있다. 


package main

import "fmt"

type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}

type Get interface {
getX1() int
}

func main() {
r := Rectangle{1,1,2,2,}
showGet(r)
}

func (r Rectangle) getX1() int{
return r.X1
}

func showGet(get Get) {
x := get.getX1()
fmt.Println(x)
}


결과값은 1이다.






이 뿐 아니라 아무거나 넣을 수 있는 void * 이기도 하다.


package main

import "fmt"

func main() {
var a interface{}
printInterface(a)

a = 1
printInterface(a)

a = "a"
printInterface(a)

r := Rectangle{1,2,3,4}
printInterface(r)
}

func printInterface(i interface{}) {
fmt.Println(i)
}

type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}



결과는 다음과 같다.


<nil>

1

a

{1 2 3 4}


'golang' 카테고리의 다른 글

[golang] 매개 변수 받기  (0) 2017.09.08
[golang] 에러(error) 예제  (0) 2017.09.07
[golang] defer 예제  (0) 2017.09.07
[golang] 함수.클로져 예제  (0) 2017.09.06
[golang] 구조체 초기화/메소드 예제  (0) 2017.08.30
Posted by '김용환'
,


go의 함수는 호출하는 함수 위, 아래에 존재할 수 있다.  { 위치에 따라 에러가 날 수 있다...

package main

import "fmt"


func main() {
helloWorld()
helloWorldGivenString("Samuel")
}

func helloWorld() {
fmt.Println("HelloWorld")
}

func helloWorldGivenString(str string) {
fmt.Println("HelloWorld " + str)
}








리턴 값이 여러 개가 될 수 있고, 매개 변수에 가변 변수를 사용할 수 있다. 


package main

import "fmt"


func main() {
fmt.Println(getTwoInteger())

_, _, last := getThree()
fmt.Println(last)


total1 := sum(1,2,3)
fmt.Println(total1)


total2 := add(3)
fmt.Println(total2)
}

func getTwoInteger() (int, int){
return 1, 1
}

func getThree() (int, string, string){
return 1, "a", "b"
}

func sum(n...int) int {
var total = 0
for _, value := range n {
total += value
}

return total
}

func add(n int) int {
if n > 4 {
return 0
}
return n+add(n+1)
}


결과는 다음과 같다.


1 1

b

6

7



파서가 좋아서 그런지 대충 써도 가변 변수는 잘 동작한다.

n ...int

n...int

n ... int



다음은 함수를 변수에 할당할 수 있음을 보여주는 예제이다. 

package main

import "fmt"


func getTwoInteger() (int, int){
return 1, 1
}

func main() {
var function1 func() (int, int) = getTwoInteger
function2 := getTwoInteger

fmt.Println(function1())
fmt.Println(function2())
}

결과는 다음과 같다.


1 1

1 1




익명 함수를 사용하는 예제이다. 


package main

import "fmt"

func main() {
func() {
fmt.Println("Hello, World")
}()

f := func() {
fmt.Println("Hello, World")
}
f()
}

결과는 다음과 같다.


Hello, World

Hello, World




함수를 클로저(closure)로 사용할 수 있다. 클로저는 함수 바깥의 값을 참조하는 함수 값을 의미한다.


package main

import "fmt"


func minusValue(n int) func() int {
i := n
return func() int {
i--
return i
}
}

func main() {
next := minusValue(10)
fmt.Println(next())
fmt.Println(next())
fmt.Println(next())
fmt.Println(next())
}

결과는 다음과 같다.


9

8

7

6

'golang' 카테고리의 다른 글

[golang] 매개 변수 받기  (0) 2017.09.08
[golang] 에러(error) 예제  (0) 2017.09.07
[golang] defer 예제  (0) 2017.09.07
[golang] interface(인터페이스) 예제  (0) 2017.09.06
[golang] 구조체 초기화/메소드 예제  (0) 2017.08.30
Posted by '김용환'
,



go 언어의 구조체는 struct으로 사용할 수 있다. 


package main

import "fmt"


func main() {


  type Rectangle struct {

    X1 int

    Y1 int

    X2 int

    Y2 int

  }


  rect := Rectangle{1,1,5,5}

  fmt.Println(rect)


  rect.X1 = 10

  fmt.Println(rect)

}




결과


{1 1 5 5}

{10 1 5 5}





strcuct를 바깥에 두어도 동일하게 동작한다.


package main

import "fmt"


type Rectangle struct {

  X1 int

  Y1 int

  X2 int

  Y2 int

}


func main() {

  rect := Rectangle{1,1,5,5}

  fmt.Println(rect)


  rect.X1 = 10

  fmt.Println(rect)

}






struct를 포인터로 가르킬 수 있다. 



func main() {

  rect := Rectangle{1,1,5,5}

  fmt.Println(rect)


  rect.X1 = 10

  fmt.Println(rect)


  r := &rect

  r.Y1 = 1e2


  fmt.Println(r)

  fmt.Println(*r)

  fmt.Println(r==&rect)

}



결과는 다음과 같다.

{1 1 5 5}

{10 1 5 5}

&{10 100 5 5}

{10 100 5 5}

true





struct의 인스턴스를 생성할 때 p := new(구조체_이름) 또는 var p *구조체_이름 = new(구조체_이름)을 사용할 수 있다.


package main


type Rectangle struct {

  X1 int

  Y1 int

  X2 int

  Y2 int

}


func main() {

  p := new(Rectangle)

  p.X1 = 1

  println(p)

  println(p.X1)

  println(p.X2)

}




package main


type Rectangle struct {

  X1 int

  Y1 int

  X2 int

  Y2 int

}


func main() {

  var p *Rectangle = new(Rectangle)

  p.X1 = 1

  println(p)

  println(p.X1)

  println(p.X2)

}



이전 두 예제의 결과는 다음과 같다.


0xc42003ff58

1

0





구조체의 초기화를 제공하지는 않지만 앱단에서 구조체에 대한 초기화 함수를 생성할 수 있다. 


package main

import "fmt"

type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}

func main() {
rect := newRectangle()
fmt.Println(rect)
}

func newRectangle() *Rectangle {
r := Rectangle{}
r.X1 = -1
r.X2 = -1
r.Y1 = -1
r.Y2 = -1
return &r
}

결과는 다음과 같다. 


&{-1 -1 -1 -1}





메소드 예제이다. 

1번째 예제는 함수에서 구조체를 리턴하는 것이고,

2번째 예제는 함수에서 구조체를 참조하는 형태이다. 


package main

import "fmt"

type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}

func main() {
rect := newRectangle()
fmt.Println(rect)

// 1
newRect := rect.init0()
fmt.Println(newRect)

// 2
newRect.init1()
fmt.Println(newRect)

}

func newRectangle() *Rectangle {
r := Rectangle{}
r.X1 = -1
r.X2 = -1
r.Y1 = -1
r.Y2 = -1
return &r
}

func (r Rectangle) init0() Rectangle {
r.X1 = 0
r.X2 = 0
r.Y1 = 0
r.Y2 = 0

return r
}

func (r *Rectangle) init1() {
r.X1 = 1
r.X2 = 1
r.Y1 = 1
r.Y2 = 1
}


결과


&{-1 -1 -1 -1}

{0 0 0 0}

{1 1 1 1}



'golang' 카테고리의 다른 글

[golang] 매개 변수 받기  (0) 2017.09.08
[golang] 에러(error) 예제  (0) 2017.09.07
[golang] defer 예제  (0) 2017.09.07
[golang] interface(인터페이스) 예제  (0) 2017.09.06
[golang] 함수.클로져 예제  (0) 2017.09.06
Posted by '김용환'
,