Client 장비에 network port가 여러개 있는 경우, 특정 network port를 지정하여 IP 패킷을 전송하고 싶을 때가 있다.
이럴 때, source IP address를 binding하면 특정 network port를 통해 IP 패킷이 전송된다.
참고: 일반적으로 Target IP address로 가기 위한 routing path 및 network port는 OS에 있는 Routing table을 통해서 자동으로 결정된다. 그러나 Target IP address로 가기 위한 routing path가 1개가 아닌 2개 이상인 경우에는 어느 network port를 통해서 IP 패킷이 나갈지 예측하기 어렵다.
package main
import (
"fmt"
"io/ioutil"
"net"
"net/http"
"time"
)
funcmain() {
##
## NOTE: 14.33.80.179를 Source IP address로 지정한다. (즉, Source IP address binding)
참고: Go Module과 Package를 사용하는 방법이 Go Version에 따라 다를 수 있다. 아래 예제는 Go 1.17을 이용한 예제이고, 아마 Go 1.11 이상을 사용하는 경우라면 아래 설명이 잘 맞을 것이다.
여담: 나는 본업이 Go Language를 사용해서 개발하는 개발자가 아니다보니, 2~3년에 한번 잠깐 GoLang을 이용해서 개발하려고 하면 Go Package와 Module 때문에 시간을 허비하게 된다. 그래서 오늘은 기왕 스터디한 것을 2~3년 뒤에 또 GoLang을 사용할 일이 있을 경우, 쉽게 Package와 Module 개념을 습득하기 위해 예제를 통해서 메모를 할까 한다.
Go PKG를 다루기 위해서는 크게 3가지 방식이 있다.
방식 A
$GOPATH 경로를 설정하고, 이 $GOPATH 경로 안에서만 Package를 사용하는 방법. (암묵적 Module 사용하기)
방식 B <-- 가장 많은 개발자가 선호하는 방식이 아닐까 생각한다.
Module을 명시적으로 선언(go mod init x.y.z)하고, 내가 원하는 폴더 어디에서든 Go Source Code를 작성하는 방법.
방식 C
go ven를 이용해서 현재 디렉토리 하위에서 모든 Package를 사용하는 방법.
각 Package 사용 방식에 대해서 아래에서 세부적으로 다룬다.
$GOPATH 경로를 선언하여 Package를 사용하는 방식
설명보다는 예제 코드를 보는 것이 좋을 듯~~~
$ vi ~/.bash_profile
...
export GOPATH=$(go env GOPATH)
...
$ . ~/.bash_profile
$ echo $GOPATH
/Users/sejong/go
$ cd $GOPATH
##
## 이제부터는 $GOPATH/src 디렉토리 밑에서만 코드를 작성해야 한다.
##
$ mkdir -p src/myexample
$ cd src/myexample
$ mkdir myPkgAlpha
$ cd myPkgAlpha
$ vi example.go
package myPkgAlpha
import"fmt"
# 주의: 패키지 외부에서 참조할 수 있도록 함수 이름은 대문자로 시작해야 한다.
funcMyExamplePrint() {
fmt.Println("My Alpha PKG")
}
$ cd ..
$ vi main.go
package main
import (
"fmt"
"myexample/myPkgAlpha"
)
funcmain() {
fmt.Println("This is main package.")
myPkgAlpha.MyExamplePrint()
}
$ go mod init myexample
$ go mod tidy
$ go build
$ ./myexample
This is main package.
My Alpha PKG
$ tree
.
├── go.mod
├── main.go
├── myPkgAlpha
│ └── example.go
└── myexample
$
$GOPATH 경로가 아닌, 나만의 별도의 Project 폴더에서 Go Module 사용하는 방식
Go module을 사용하면 $GOPATH 경로가 아닌 아무 곳(디렉토리)에서 Go Source Code를 작성할 수 있는 자유가 생긴다.