본문 바로가기
카테고리 없음

go programming - strings.HasPrefix 사용

by Warehaus 2023. 7. 3.

사진: UnsplashGlenn Carstens-Peters

 

 

2023.06.24 - [CS/Go] - [Go programming] Requesting http get method to an url from an argument

 

[Go programming] Requesting http get method to an url from an argument

사진: Unsplash의Sergey Zolkin Today, I made a test program to get response by requesting http get method. Here's the sample code. package main import ( "fmt" "io/ioutil" "net/http" "os" ) func main() { for _, url := range os.Args[1:] { // Request http g

armin.tistory.com

 

안녕하세요,

이전 포스팅에서 argument를 통해 전달받은 url에 http get request를 던지고

응답을 받는 예제를 구현해 봤었습니다.

 

오늘은 접두사를 추가하여 해당 코드를 조금 더 개선하는 작업을 진행해 보려고 합니다.

 

필요한 작업은 다음과 같습니다.

 

1. Argument로 전달되는 URL 에 prefix를 확인 ( http://  가 있는지 )

2. http:// 가 없는 URL을 전달받은 경우 앞에 붙인 뒤 http requst

 

 

내용은 심플 합니다.

 

1, 2에 해당하는 동작을 구현해 봅니다.

단순하게는 아래 코드처럼 작성해 볼 수 있을 것 같습니다.

 

반응형

 

 

package main

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

func main() {
	for _, url := range os.Args[1:] {

		// Check http://
		if url[0:7] != "http://" {
			url = "http://" + url
		}

		// Request http get with given url from the first argument.
		resp, err := http.Get(url)
		if err != nil {
			fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
			os.Exit(1)
		}
		// read body of response.

		if _, err := io.Copy(os.Stdout, resp.Body); err != nil {
			fmt.Printf("Error: %s", err)
		}

		resp.Body.Close()

		if err != nil {
			fmt.Fprintf(os.Stderr, "fetch: reading %s : %v\n", url, err)
			os.Exit(1)
		}
	}
}

 

URL이 제대로 들어오지 않은 경우 다양한 예외들이 존재하지만

일단은 단순하게 앞에 http:// 가 있는지 정도만 확인해 보았습니다.

 

위 코드에서는 url [0:7]까지 string을 확인해 보고 http:// 를 체크하는 방식으로 구현을 했습니다.

(충분하지 않은 길이의 url이 들어오는 예외도 처리는 필요합니다.)

 

 

반응형

strings.HasPrefix

 

앞에서 구현한 코드도 사용은 가능하겠지만

strings 패키지의  HasPrefix함수를 사용해서 더 쉽게 구현해 보겠습니다.

 

HasPrefix 함수는 문자열이 주어진 prefix로 시작하는지 여부를 확인하는 함수입니다.

 

 

https://pkg.go.dev/strings#HasPrefix

 

strings package - strings - Go Packages

Title returns a copy of the string s with all Unicode letters that begin words mapped to their Unicode title case. Deprecated: The rule Title uses for word boundaries does not handle Unicode punctuation properly. Use golang.org/x/text/cases instead. packag

pkg.go.dev

 

 

코드는 다음과 같습니다.

 

package main

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

func main() {
	for _, url := range os.Args[1:] {

		// Check http://
		// if url[0:7] != "http://" {
		// 	url = "http://" + url
		// }

		if !strings.HasPrefix(url, "http://") {
			url = "http://" + url
		}

		// Request http get with given url from the first argument.
		resp, err := http.Get(url)
		if err != nil {
			fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
			os.Exit(1)
		}
		// read body of response.

		if _, err := io.Copy(os.Stdout, resp.Body); err != nil {
			fmt.Printf("Error: %s", err)
		}

		resp.Body.Close()

		if err != nil {
			fmt.Fprintf(os.Stderr, "fetch: reading %s : %v\n", url, err)
			os.Exit(1)
		}
	}
}

 

다음과 같이 strings.HasPrefix 함수를 통해 url 내 'http://' prefix를 확인하고 없는 경우 url에 http://  를 추가해 주고 있습니다.

 

if !strings.HasPrefix(url, "http://") {
    url = "http://" + url
}

 

HasPrefix함수를 이용하여 prefix를 체크하는 경우

제가 앞에 단순하게 구현한 코드보다 구현 측면에서 편리함이 있을 것입니다.

 

매번 체크해야 하는 substring의 길이만큼 slicing 하는 것도 일일 될 테니까요.

 

또한, 입력되는 문자열의 길이를 별도로 체크하지 않아도 된다는 점이

HasPrefix의 편리함이 되지 않을까 생각됩니다.

 

 

 

 

wh.