본문으로 바로가기
728x90
반응형
728x170

안녕하세요. 오늘은 Golang에서 지정한 포트번호로 localhost를 접속해야 할 때 방법을 공유해보려 합니다.


커맨드라인 인자 (Command-line arguments)는 프로그램의 실행을 매개변수화하는 일반적인 방법입니다. 

예를 들어, go run hello.go는 go 프로그램에 run과 hello.go를 인자로 사용합니다.

os.Args는 커맨드라인 인자를 그대로 접근하는 방법을 제공합니다. 

 

보통 "net/http"를 사용하여 간단한 핸들러 추가하여 서버를 실행시키실 때

package main

import (
	"fmt"
	"net/http"
	"os"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Hello World")
	})
	
	http.ListenAndServe(":3000", nil)
}

 

위와 같은 형태로 포트번호가 고정인 형태 일텐데요.

 

커맨드라인 인자를 실험하려면 우선 go build로 바이너리를 빌드하는 것이 가장 좋습니다.

 

여기에서 "os" 패키지의 os.Args를 사용하여 코드에 추가해 보겠습니다.

package main

import (
	"fmt"
	"net/http"
	"os"
)

func main() {
	printArgs := os.Args
	printSlice := os.Args[1:]
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Hello World")
	})

	fmt.Println(printArgs)
	fmt.Println(printSlice)
	http.ListenAndServe(":3000", nil)

}

 

이를 실행시켜 어떤 형태로 출력되는지 보죠.

 

printArgs 슬라이스의 첫번째 값은 프로그램의 경로이며, os.Args[1:]가 프로그램의 인자를 가집니다.
일반적인 인덱싱을 사용해 개별 인수들을 얻을 수 있다는 것을 확인할 수 있죠.

 

이걸 이용해서 만들어 볼 겁니다. 코드는 아래와 같습니다.

package main

import (
	"fmt"
	"net/http"
	"os"
)

func main() {
	var port string = "8080" // init

	if len(os.Args) == 2 {
		port = os.Args[1]
	}

	argsWithProg := os.Args

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Hello World")
	})

	fmt.Println(argsWithProg)
	fmt.Println(os.Args[1])
	http.ListenAndServe(":"+port, nil)
}

먼저 포트 번호를 붙이지 않은 상태에서 go run main.go 부분이 0번이기 때문에 그 뒤에 붙을 포트번호는 1번 인덱스가 되는 것을 이용한 방법입니다.

 

port 값을 3000으로 해서 뒤에 포트를 지정하지 않았을 시 기본 포트를 3000으로 하고,  뒤에 포트가 붙으면 지정한 포트 번호의 서버가 실행 될 수 있도록 하였습니다.

그런데 뒤에 포트가 붙을 때를 알려주어야 하는데 그 상황 때 os.Args가 2가 되기 때문에 len(os.Args) == 2 로 조건값을 넣었습니다.

 

의미 없는 것들을 없애면 아래와 같은 코드로 정리가 됩니다.

 

package main

import (
	"fmt"
	"net/http"
	"os"
)

func main() {
	var port string = "8080" // init

	if len(os.Args) == 2 {
		port = os.Args[1]
	}

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Hello World")
	})

	http.ListenAndServe(":"+port, nil)
}
728x90
반응형
그리드형

댓글을 달아 주세요