go 앱을 docker빌드할 때 ENV를 쓰지 않아도 된다!!!




자세한 내용은 이곳을 참조했다.

https://hub.docker.com/_/golang/




Main.go 소스는 다음과 같다.


package main


import (

    "fmt"

)


func main() {

    fmt.Println("Hello World")

}





Dockerfile은 다음과 같다. 


FROM golang:onbuild


RUN mkdir /app

ADD . /app/

WORKDIR /app

RUN go build -o main .

CMD ["/app/main"]



이제 빌드와 실행을 해본다.



$ docker build -t example .

Sending build context to Docker daemon  4.096kB

Step 1/6 : FROM golang:onbuild

# Executing 3 build triggers...

Step 1/1 : COPY . /go/src/app

Step 1/1 : RUN go-wrapper download

 ---> Running in eb597cae57ef

+ exec go get -v -d

Step 1/1 : RUN go-wrapper install

 ---> Running in 3cc20f3cc840

+ exec go install -v

app

 ---> 11d942c55dfb

Removing intermediate container 4eca92f17e78

Removing intermediate container eb597cae57ef

Removing intermediate container 3cc20f3cc840

Step 2/6 : RUN mkdir /app

 ---> Running in 1035dea0ce0d

 ---> 9fbe4249fc32

Removing intermediate container 1035dea0ce0d

Step 3/6 : ADD . /app/

 ---> 8950d77f106e

Removing intermediate container d43b4043d9bf

Step 4/6 : WORKDIR /app

 ---> 465bff3b7275

Removing intermediate container d21a6bdc6c31

Step 5/6 : RUN go build -o main .

 ---> Running in 9e1c1b5a0123

 ---> 9e27407b57d4

Removing intermediate container 9e1c1b5a0123

Step 6/6 : CMD /app/main

 ---> Running in 4dbe90267d84

 ---> a8861bcaebad

Removing intermediate container 4dbe90267d84

Successfully built a8861bcaebad

Successfully tagged example:latest



실행 결과는 다음과 같다.


$ docker run -it --rm --name my-example example

Hello World

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

[golang] imported and not used  (0) 2017.09.05
go 컨퍼런스 자료  (0) 2017.09.01
[golang] if 예제  (0) 2017.08.29
[golang] 반복문 - for / 문 예제  (0) 2017.08.29
[golang] 타입 확인하는 방법 - reflect.TypeOf  (0) 2017.08.29
Posted by '김용환'
,



https://golang.org/doc/faq#unused_variables_and_imports


Can I stop these complaints about my unused variable/import?

The presence of an unused variable may indicate a bug, while unused imports just slow down compilation, an effect that can become substantial as a program accumulates code and programmers over time. For these reasons, Go refuses to compile programs with unused variables or imports, trading short-term convenience for long-term build speed and program clarity.

Still, when developing code, it's common to create these situations temporarily and it can be annoying to have to edit them out before the program will compile.

Some have asked for a compiler option to turn those checks off or at least reduce them to warnings. Such an option has not been added, though, because compiler options should not affect the semantics of the language and because the Go compiler does not report warnings, only errors that prevent compilation.

There are two reasons for having no warnings. First, if it's worth complaining about, it's worth fixing in the code. (And if it's not worth fixing, it's not worth mentioning.) Second, having the compiler generate warnings encourages the implementation to warn about weak cases that can make compilation noisy, masking real errors that should be fixed.

It's easy to address the situation, though. Use the blank identifier to let unused things persist while you're developing.

import "unused"

// This declaration marks the import as used by referencing an
// item from the package.
var _ = unused.Item  // TODO: Delete before committing!

func main() {
    debugData := debug.Profile()
    _ = debugData // Used only during debugging.
    ....
} 
Nowadays, most Go programmers use a tool, goimports, which automatically rewrites a Go source file to have the correct imports, eliminating the unused imports issue in practice. This program is easily connected to most editors to run automatically when a Go source file is written.


 
import (
"fmt"
)


import "fmt"


./Test.go:3: imported and not used: "fmt"




아래와 같이 해야 에러가 발생하지 않는다. 



import (
_ "fmt"
)

func main() {

}






func main() {
i := 0
_ = i
}


Posted by '김용환'
,

go 컨퍼런스 자료

go lang 2017. 9. 1. 14:14



2017년 go 컨퍼런스 자료


https://github.com/gophercon



gophercon 2017 자료



https://github.com/gophercon/2017-talks

Posted by '김용환'
,

[golang] if 예제

go lang 2017. 8. 29. 20:32



go 언어는 다음 언어의 if와 다르게 if 표현식에 ( )를 사용하지 않는다. 



package main

import "fmt"


func main() {

  i := 1

  j := 2

  if i < 0 && j < 2 {

    fmt.Println("-")

  } else {

    fmt.Println("+")

  }

}


특이할 점은 if 문에 할당이 가능하다. 

package main
import "fmt"

func main() {
  if i := 0 ; i < 2 {
    fmt.Println("-")
  } else {
    fmt.Println("+")
  }
}


게다가 if 문 안에서 할당된 변수는 if / else 문에서 사용할 수 있다. 


func main() {

  if i := 0 ; i < 2 {

    fmt.Println(i)

  } else {

    fmt.Println(i)

  }

}





Posted by '김용환'
,



go 언어의 for 문은 다음의 예제와 비슷하다. 



for 문의 표현식은 기존처럼 조건문과 종료 조건을 사용할 수 있다. 



func main() {

  for i := 1; i < 10; i++ {

    println(i)

  }

}




결과는 다음과 같다. 


1

2

3

4

5

6

7

8

9




for 문의 표현식에 종료 조건을 사용할 수 있다.



package main

import "fmt"


func main() {

  i := 1

  for i < 10 {

    fmt.Println(i)

    i++

  }

}




결과는 다음과 같다.

1
2
3
4
5
6
7
8
9





또한 계산 expression은 사용할 수 없다. 다음 for문은 syntax error: i++ used as value 에러가 발생한다. 




func main() {

  i := 1

  for i < 10 {

    fmt.Println(i++)

  }

}




func main() {

  i := 1

  for i++ < 10 {

    fmt.Println(i)

  }

}







무한 루프가 되려면 for 조건을 사용하지 않는다.


func main() {


  for { }


}




range를 지원한다.


func main() {

  numbers := []int {10, 9, 8}

  for i, number := range numbers {

      println(i, number)

  }

}



이전 예제의 []int는 int 타입을 갖는 엘리먼트의 슬라이스(slice)이다. 




그러나 다음은 동작하지 않는다. 


  for i := range [1..10] {

      println(i)

  }



for문 안에 continue, break, goto를 사용할 수 있다. 



go 언어에서는 while은 지원하지 않는다. 





Posted by '김용환'
,


타입을 확인하는 방법은 reflect 패키지를 임포트한 후 TypeOf 메소드를 사용한다. 




예제는 다음과 같다. 


package main

import "fmt"

import "reflect"


func main() {


  var x, y = 1, "2"

  fmt.Println(x, y)

  fmt.Println(reflect.TypeOf(x))

  fmt.Println(reflect.TypeOf(y))

  fmt.Println()


  m := 1.2

  fmt.Println(m)

  fmt.Println(reflect.TypeOf(m))

}



결과는 다음과 같다.

1 2
int
string

1.2
float64



Posted by '김용환'
,


go언어는 immutable을 지원하지 않는다. 


string의 경우는 새로운 char[]을 생성해서 매번 새로운 문자열을 리턴하도록 한다. 


따라서 var만 있지 val은 없다. 



다음은 예제이다. 

package main

import "fmt"


func main() {

   var a = 1

   fmt.Println(a)

   a = 2

   fmt.Println(a)


   b := 10

   fmt.Println(b)

   b = 20

   fmt.Println(b)


   c := "aaaa"

   fmt.Println(c)

   c = "bbbb"

   fmt.Println(c)

}



결과이다.


1

2

10

20

aaaa

bbbb



go 언어에서 문자열에 대해서 변수 할당을 하지 못하게 하려면 상수 타입인 const를 사용한다. 


func main() {

  const x = "1"

  x = "2"

}





Posted by '김용환'
,


go 언어에서 함수 리턴 타입을 적을 때 ()을 사용할 때 튜플을 표현하지 않는다. 그저 묶음 표현일 뿐이다. 


스칼라에 익숙한 개발자라면 놓칠 수 있는 내용인데,.. 사실 go에는 튜플이 없다...



package main

import "fmt"


func main() {

   fmt.Println(add(1,2))

   x, y := add(1,2)

   fmt.Println(x, y)


   fmt.Println(minus(2,1))

}


func add(x int, y int) (int, int) {

  return x + y, x - y

}



func minus(x int, y int) (int) {

  return x - y

}



결과는 다음과 같다. 


3 -1

3 -1

1



함수의 매개변수를 정의할 때 (x int, y int)를 (x, y int)로 바꿔 사용할 수도 있다. 




func add(x, y int) (int, int) {

  return x + y, x - y

}



func minus(x, y int) (int) {

  return x - y

}






함수의 리턴 타입을 정의할 때 변수명을 지정할 수 있다. 함수 내부에서 바인딩되게 하고 리턴할 때 값을 특별히 지정하지 않아도 된다. 


package main
import "fmt"

func main() {
   fmt.Println(split(1))
}

func split(x int) (y, z int) {
  y = x + 2
  z = x + 10
  return
}


결과는 다음과 같다.

3 11


Posted by '김용환'
,


go 언어에는 멀티라인을 제공한다. 


한번에 `(backslash)를 사용할 수 있고 문자열 concatenation을 사용할 수도 있다. 



코드는 다음과 같다. 


  multilineLiteral1 := `aa

  ㅁㅁㅁㅁ

  `


  fmt.Println(multilineLiteral1)



결과는 다음과 같다.


aa

  ㅁㅁㅁㅁ







double quote로도 수행할 수 있다. 



  multilineLiteral2 := "aa  \n" +

  "ㅁㅁㅁ"


  fmt.Println(multilineLiteral2)


결과는 다음과 같다. 


aa

ㅁㅁㅁ




하지만 간단하지만 go에서는 다음 코드를 지원하지 않는다.  자바/스칼라 개발자에게는 의아할 수 있다..



multilineLiteral3 := "s \\n

  aaa"




multilineLiteral4 := "s \\n"

+  "aaa"

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

[golang] go 언어는 not immutable 언어이다. (string 제외)  (0) 2017.08.29
[golang] 함수 리턴 타입에 괄호 사용하는 예제  (0) 2017.08.29
[golang] Go 공부 시작 링크  (0) 2017.08.29
go 1.5 발표  (0) 2015.06.03
godeps 예제  (0) 2015.04.02
Posted by '김용환'
,


go를 공부할 때, 도움되는 싸이트이다.






go 슬라이드 자료 

https://www.slideshare.net/songaal/lets-go-45867246

Let's Go (golang) from Song Sang




go 첫 시작

https://go-tour-kr.appspot.com/#1


이재홍님의 한글 책

http://pyrasis.com/private/2015/06/01/publish-go-for-the-really-impatient-book


예제로 배우는 go

http://golang.site/go/article/1-Go-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%96%B8%EC%96%B4-%EC%86%8C%EA%B0%9C



go by example

https://gobyexample.com/


디펜던스 관리 - godep

https://github.com/tools/godep


패키지 목록

https://golang.org/pkg/


문서

https://golang.org/doc/

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

[golang] 함수 리턴 타입에 괄호 사용하는 예제  (0) 2017.08.29
[go] 멀티라인 (다중 라인)  (0) 2017.08.29
go 1.5 발표  (0) 2015.06.03
godeps 예제  (0) 2015.04.02
[go lang] command option 받기  (0) 2015.03.28
Posted by '김용환'
,