잠시만 기다려 주세요

HOME   |  여기는?   |  바다물때표   |  여러가지 팁 (888)  |  추천 및 재미 (153)  |  자료실 (20)  |  끄적거림 (520)  |  시나리오 (760)  |  드라마 대본 (248)  |  

2020년 09월 24일
보이지 않는 샘으로 점을 찍는다. - 바다아이
 




    golang

golang - go 언어 패키지 개념....
이 름 : 바다아이   |   조회수 : 2816         짧은 주소 : https://www.bada-ie.com/su/?141591822599
go 의 간략 구조 함 봅시다.

bin - 실행파일 위치... 그러나... 대부분 자기가 원하는 곳에 실행파일을 넣기 때문에 텅 비어 있죠 ^^;
src - 실제 패키지 소스들이 위치하는 곳입니다.
pkg - 컴파일 후 main 프로그램 말고 import 로 가져온 패키지들의 라이브러리 들이 위치하는 곳입니다. .a 로 만들어지죠..

여기서 중요한 개념이 src 와 pkg 그리고 bin 인데요...
예네들은 go 가 설치된 곳에도 있고 (이건 go의 기본 패키지들이죠)
또한 사용자들이 쓰는 개인 폴더에도 똑같이 존재합니다. 아래를 보면....

PATH=$PATH:$HOME/bin:/usr/local/go/bin

export PATH

GOPATH=/home/원하는폴더
GOROOT=/usr/local/go

export GOPATH
export GOROOT

이제 GOROOT 와 GOPATH 를 왜 잡아주는지 이제는 이해를 하셔야 합니다.
GOROOT 는 실제 설치된 GO 의 위치, GOPATH 는 자신이 사용할 폴더입니다.
둘다 똑같이 src, bin, pkg 가 존재하는 것이죠....
bin하고 pkg 는 알아서 컴파일시 만들어지고 (bin 은 없을 수도 있죠...)
src 만 자신이 만들어서 거기에 소스들을 위치시키면 됩니다.

그럼 본격적으로 패키지 사용법과 만드는 법을 알아 봅시다.

go 언어에서 젤루 중요한 것이 패키지 개념입니다.
클래스가 없기 때문에 패키지 개념으로 접근하셔야 합니다.
보통 import 를 통해 패키지들을 가져옵니다
예를 들면

import "net/http"
import aaa "net/http"

이런 식으로 불러오게 됩니다.
사용은 슬래시 구분 제일 마지막 것을 패키지 이름으로 사용하게 됩니다.
정확히는 import 시에 다음은 src 안의 폴더 경로라고 보시면 됩니다. src 가 root 가 되는 거죠..
또 하나.. 2번째 보면 alias 로 다른 이름으로 바꿔서 프로그램 안에서 사용할 수도 있습니다.

http.HandleFunc("/", 함수이름)
aaa.HandleFunc("/", 함수이름)

import 부분 보면서 개념을 잡아보면 쉽게 폴더이름이라고 생각하고 그렇게 만드시면 됩니다.
net 폴더http 폴더에 있는 패키지는 http 패키지이다. 이런식으로요...

http 폴더 안에 있는 모든 파일은 http 패키지가 되는 것입니다.
그 파일들 상단에는 반드시

package http

이렇게 선언이 되어야 합니다. 그래야 go 언어가 그것을 찾아서 작업을 합니다.
반드시 import 폴더 경로 이름과 패키지 이름이 같아야 합니다.
그렇게 작업하세요.. 아니어도 되는데 무조건 그렇게 생각하셔야 합니다. 그래야 작업이 힘들지 않습니다.
이거 꼬아 놓는 사람은 진짜 일부러 꼬아놓는 겁니다. 협업한다면 절대적입니다.


이제 이해가 되시는지 모르겠습니다.
여기서 젤루 중요한 점은 GOROOT 와 GOPATH 가 제대로 잡혀있지 않으면
GO 언어는 패키지들을 찾지 못하게 됩니다. 그러니 작업 전에 잘 잡아주시고 해야 겠지요...

이제 마지막으로 남이 만들어 놓은 패키지들.. github.com 같은 곳에 있는 외부패키지들을 가져와서 사용하는 방법입니다.

먼저 사용에 앞서 외부패키지를 가져와야 합니다. 그때 사용하는 명령어가 go get 입니다. 콘솔에서 해야 겠죠...
아무 곳에서나 치면 됩니다. 어차피 경로는 우리가 잡아 놓았기 때문에 알아서 src 로 받아지게 됩니다.
경로 그대로 받아져 있을 겁니다. github.com, abh, geoip 폴더가 src 에 생성되어 있을 겁니다.

go get github.com/abh/geoip

사용은 예를 들어 함수 하나를 만들어 보면....

import   "github.com/abh/geoip"

func GeoIpMan(ip string) string {
    file := "/usr/share/GeoIP/GeoIP.dat"

    gi, err := geoip.Open(file)
    if err != nil {
        log.Printf("Could not open GeoIP database\n")
    }

    countryCode, _ := gi.GetCountry(ip)

    return countryCode
}

빨간 글씨 보이시죠?.... 이렇게 사용되는 것입니다.
자 이제 설명할 만큼 다 설명했습니다. 이해가 가셨다면 좋겠습니다.
혹시 이해가 가지 않으시면 다시 반복해서 읽으시면서 이해하시기 바랍니다.
그럼

참고)

import 시 패키지앞에  _ 언더바가 붙는 것이 있습니다...
이것은 init() 함수를 실행하기 위함입니다. 참고 하세요...

또한 golang 은 사용하지 않는 패키지를 import 한뒤 컴파일 할 경우 컴파일 에러가 발생 합니다.
언더바를 앞에 붙이면 사용하지 않더라도 에러가 나지 않게 할수 있습니다.

번외)

go build 나 go run 을 실행하면 pkg 에 .a 파일을 만들지 않습니다.
그러나 go get 으로 가져올 때나 특정 패키지 폴더에 들어가서 go install 을 하시면 pkg 에 .a 파일을 만들죠..
.a 파일이 만들어지면 나중에 다시 컴파일 할 때 변경되지 않는 한 중복해서 컴파일을 하지 않습니다.
가져와서 그대로 쓰죠... 변경되지 않는 것이라면 .a 를 만들어 놓으면 중복된 컴파일로 시간을 버리진 않겠죠...
근데 경험상 저같은 경우 go 컴파일 자체가 워낙 빨라서
남의 소스 go get 으로 가져오지 않는 한 대부분 소스는 그냥 .a 를 만들지 않습니다. ^^;
run 과 build 로 대부분 끝내요..

그리고 또 하나...
src 에 패키지 하나하나 폴더는 그대로 패키지 명으로 폴더를 생성해서 그 안에 소스 파일들을 위치합니다만
.a 가 만들어질 때 pkg 에는 src 해당 패키지 폴더명 이름으로 .a 가 생성됩니다.
그래서 폴더 이름하고 패키지 명이 일치해야 나중에 헷갈리지 않습니다.
pkg 로 보면 src 에 있는 폴더 하나하나가 패키지 명으로 된다 생각하는 겁니다.
우리가 pkg 생성되는 것에 대해 크게 신경을 쓰지 않아도 되지만 흘러가는 개념은 아셔야 합니다.
 
| |


      1 page / 6 page
번 호 카테고리 제 목 이름 조회수
173 golang , String Formatting 바다아이 241
172 golang rand.Intn , random, , . 바다아이 252
171 golang golang ... 바다아이 1419
170 golang golang gopath, goroot .. 바다아이 1074
169 golang golang ... Force download file example 바다아이 1573
168 golang golang , , cpu, memory, disk 바다아이 2291
167 golang golang , ... GOOS, GOARCH 바다아이 1617
166 golang golang checkbox ... 바다아이 1847
165 golang golang , , http .... 바다아이 1784
164 golang golang nil , nil , nil ... 바다아이 1882
163 golang 2 golang, go , .... golang .... 바다아이 2685
162 golang golang postgresql, mysql, mariadb ... ` Grave () .. .. 바다아이 1959
161 golang golang postgresql mysql, mariadb scan , null .. 바다아이 2052
160 golang golang , iconv 바다아이 2200
159 golang golang quote escape, unquote 바다아이 2116
158 golang golang , http errorLog , , ... 바다아이 2221
157 golang golang interface , 바다아이 2154
156 golang golang struct .... 바다아이 2280
155 golang golang map map , 바다아이 2140
154 golang golang map .... .... 바다아이 2110
153 golang golang slice copy 바다아이 2065
152 golang golang goto 바다아이 2151
151 golang golang slice sort , int, string, float64 바다아이 2218
150 golang URL Parsing, url . parse 바다아이 2282
149 golang golang , interface{} ... 바다아이 2206
148 golang golang interface to string, , , map slice json 바다아이 2051
147 golang golang How to convert JSON string to map and slice, json 바다아이 2207
146 golang golang , file write, Writing Files 바다아이 2331
145 golang golang Insert Line or String to File, , , , , 바다아이 2079
144 golang golang replace 바다아이 2160
| |








Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ FreeBSD + GoLang + PostgreSQL ]
서버위치 : vultr.com 서울  실행시간 : 0.04426
to webmaster... gogo sea. gogo sea.