반응형

■ get 명령어 정의

GO 언어에서 사용하는 get 명령어는 자신의 프로젝트에서 기본적으로 제공하는 패키지를 제외하고 사용하고 싶은 외부 패키지를 불러와서 사용할 수 있도록 해주는 명령어이다.


!!! 확인

해당 작업은 Go가 설치 되어 있다는 가정하에 진행된다.

설치가 안되어있는경우 아래 페이지에서 확인하길 바란다.

 

[Go] Go 언어 개발 환경 구축

1. Go 설치 사이트로 이동 The Go Programming Language Download Go Binary distributions available for Linux, macOS, Windows, and more. // You can edit this code! // Click here and start typing. packag..

hyunmin1906.tistory.com

 작업 과정

1. GOPATH 정의

GOPATH는 자신의 프로젝트 루트 경로이며, 기본적으로 3개의 폴더를 갖는다.


  • src : 외부 패키지의 소스 및 자신의 프로젝트가 저장될 위치
  • pkg :  외부 패키지의 컴파일이 끝난 오브젝트 파일들이 저장될 위치
  • bin : 실행파일, 바이너리 파일들이 저장될 위치

2. GOPATH 확인

GOPATH는 외부 패키지를 활용하여 자신의 프로젝트를 진행할 위치가 된다.

따라서 자신의 GOPATH를 확인하고 진행한다.

 

2.1 go env 명령어로 GOPATH의 경로를 확인하는 방법

  • 커멘드(cmd)창 실행
  • go env 명령어 입력

2.2 시스템 변수로 확인하는 방법

  • [제어판 > 모든 제어판 항목 > 시스템] 경로 이동
  • 고급 시스템 설정 클릭 

  • 시스템 속성창
  • 고급 탭으로 이동
  • 환경 변수 버튼 클릭

  • 사용자 변수 GOPATH 편집 또는 없을 경우 새로만들기 버튼 클릭

  • GOPATH 변수 값 확인 또는 변경 가능
  • 확인 버튼 클릭


3. get 명령어로 외부 패키지 활용

3.1 개인 프로젝트의 루트 경로로 이동

  • 커멘드(cmd)창 실행
  • GOPATH 경로로 이동

3.2 GO111MODULE 설정값 확인 또는 변경

3.2.1 GO111MODULE 정의

  • on : 루트 경로의 src 폴더에 외부 패키지 소스 파일 생성 안됨, pkg 폴더에 외부 컴파일된 파일 생성됨
  • off : 루트 경로의 src 폴더에 외부 패키지 소스 파일 생성 됨, pkg 폴더에 외부 컴파일된 파일 생성됨
  • auto : on/off를 자동으로 설정됨

3.2.2 GO111MODULE 확인

  • 커멘드(cmd)창 실행
  • [go env] 명령어 입력
공백이라고 해서 off 라고 확정할 수 없다. 따라서 정확하게 작업하기 위해서 
3.2.1 GO111MODULE 정의를 참조 하여 지정하고 작업을 진행하길 바란다.

 

3.2.3 GO111MODULE 수정

go env 의 환경 설정은 커멘드창이 실행되고 있는 동안에 유지되는

일회성 환경 설정과 커멘드창이 종료되어도 설정이 유지되는 영구 환경 설정이 있다.

영구 환경 설정이라고해서 수정이 불가능 한것이 아니니 걱정하지 않아도 된다.

  • 커멘드(cmd) 창 실행
  • 일회성 환경 설정 : [set GO111MODULE= (on 또는 off 또는 auto )] 입력
  • 영구 환경 설정 : [go env -w GO111MODULE= (on 또는 off 또는 auto)] 입력

3.2.3.1 일회성 환경 설정

명령어 : set GO111MODULE= (on 또는 off 또는 auto)

 

3.2.3.2 영구 환경 설정

명령어 : go env -w GO111MODULE =(on 또는 off 또는 auto)

 

3.3 get 명령어 실행

  • GO111MODULE 설정값 확인. (필자의 경우 src와 pkg 를 생성하기 위해 off로 설정)
  • 설치하고자 하는 외부 패키지 지정(필자의 경우 gin 프레임워크를 설치하고자 한다.)
  • go get [외부 패키지] 입력 (get 명령어는 부가 옵션 [-u, -d 등] 여러개가 있지만 필자는 사용하지 않는다.)
  • GOPATH/src 또는 GOPATH/pkg 에서 설치된 외부 패키지 확인

3.3.1 GOPATH/src 폴더 확인

3.3.2 GOPATH/pkg 폴더 확인


반응형
반응형

Go 언어 함수

func는 여러 프로그래밍 언어(JavaScript, Python 등)에서 일반적으로 사용하는 함수형태와 유사하지만, Go 언어에서는 특별하게 다수의 리턴값을 가질 수 있으며, 또한 리턴할 변수를 미리 선정하고 리턴시킬 수 있다.


1) 한개의 값을 리턴하는 함수

예시) 자료형이 string인 한개의 값을 리턴하는 함수
func SingleReturn(name string) string {
    return name
}

2) 다수의 값을 리턴하는 함수

예시) 자료형이 int, string인 다수의 값을 리턴하는 함수
func ManyReturn(name string) (int, string) {    
    return len(name), name
}

3) 변수를 지정해서 리턴하는 함수

예시) 자료형이 int, string인 변수를 지정하여 값을 리턴하는 함수
func FixReturn(name string) (lenName int, upperName string) {   
      lenName = len(name)    
      upperName = strings.ToUpper(name)    
      return
}

4) 다수의 값을 인자로 받는 함수

예시) 자료형이 string인 다수의 값을 인자로 받는 함수
func ManyArgument(names ...string) {    
      fmt.Println(names)
}

Go 언어 메소드

메소드는 리시버(receiver)에 접근하여 작업이 가능하다. 또한 메소드는 같은 패키지에 있는 리시버만을 선언할 수 있으며, 주로 리시버는 구조체(Struct) 이다. 쉽게 말해 함수에 리시버가 있으면 메소드이다.


1) 벨류 리시버(Value Receiver)로 필드 접근

* Value Receiver는 리시버에 해당하는 새로운 객체를 복제하기 때문에 실제 객체에는 영향이 없다.

예시) person 구조체의 모든 필드에 값을 삽입하고, 출력하시오.
type Person struct {    
    name    string    
    age     int    
    address string
}

func (p Person) searchPerson() {    
     fmt.Println(p.name, p.age, p.address)
}

func main() {
    myInfo := Person{"hyunmin", 28, "서울시 용산구"}
    myInfo.searchPerson()
}
// 출력결과 : hyunmin 28 서울시 용산구

2) 포인터 리시버(Pointer Receiver)로 필드 접근

* Pointer Receiver는 실제 객체에 접근하여 작업이 가능하다.(수정, 검색 등)

예시) person 구조체의 모든 필드에 값을 수정하고 출력하시오.
type Person struct {
	name    string
	age     int
	address string
}

func (p *Person) searchPerson() {
	fmt.Println(p.name, p.age, p.address)
}
func (p *Person) changePerson() {
	p.name = "donghun"
	p.age = 27
	p.address = "서울시 강서구"
}

func main() {
	myInfo := Person{"hyunmin", 28, "서울시 용산구"}
	// 수정 전
	myInfo.searchPerson()
	// 수정 작업
	myInfo.changePerson()
	// 수정 후
	myInfo.searchPerson()
}

// 출력 결과
// hyunmin 28 서울시 용산구
// donghun 27 서울시 강서구

반응형
반응형

■ Go 언어 구조체

Struct는 Object와 같이 여러 자료형의 데이터를 저장할 수 있는 자료구조이다.

쉽게 말해 Map의 경우 key의 자료형과 value의 자료형을 설정하고 해당 자료형의 데이터만 저장할 수 있다. 하지만, Struct는 string, int, slice등 다양한 자료형의 데이터를 class와 유사하게 저장할 수 있다. 또한, Struct를 생성하고 필드에 데이터를 삽입하는 작업은 다양하게 가능하며 기호에 맞게 사용할 수 있다.


Struct

예시) 이름과 나이, 주소를 저장하는 Struct를 선언하고, 임의의 데이터를 저장하여 
Struct에 저장된 모든 데이터를 호출하시오.

 * Struct를 생성하고 필드에 데이터를 삽입하는 작업은 다양하게 가능하며 기호에 맞게 사용할 수 있다.
type person struct {    
       name    string    
       age     int    
       address string
}

func main(){
        // 1. 모든 필드 데이터 저장
        myInfo1 := person{name: "hyunmin", age: 28, address: "서울시 용산구"}

        // 2. 모든 필드명을 생략하고 선언한 필드 순서대로 데이터 저장
        myInfo2 := person{"hyunmin", 28, "서울시 용산구"}

        // 3. 공백 Struct를 생성하고 모든 데이터 저장
        myInfo3 := person{}    
        myInfo3.name = "hyunmin"    
        myInfo3.age = 28    
        myInfo3.address = "서울시 용산구"

        fmt.Println(myInfo1)
        fmt.Println(myInfo2)
        fmt.Println(myInfo3)
}

// 출력 결과
// {hyunmin 28 서울시 용산구}
// {hyunmin 28 서울시 용산구}
// {hyunmin 28 서울시 용산구}

반응형
반응형

■ Go 언어 맵

Map은 중복되지 않는 key와 중복이 가능한 value를 갖는 자료구조이며,

일반적으로 key에 해당하는 value를 도출하고 싶을때 사용한다.

즉, name이라는 key에 해당하는 value값 hyunmin을 호출할 수 있다.

Map은 배열과 달리 순서가 없는 자료구조이기 떄문에 반복문을 통해 데이터를 호출할 경우 호출할때마다 다른 순서로 데이터가 호출된다.


예시) key와 value의 데이터 타입이 string인 map을 선언하고 key로 'name'과 'age'를 갖고, value로 'hyunmin', '28'을 갖는 map을 생성하여 전체 데이터를 호출하시오.
data := map[string]string{"name": "hyunmin", "age": "28"} 
   
for key, value := range data {        
      fmt.Println(key, value)    
}

/*
※ 출력 결과
name hyunmin
age 28
 
또는

age 28
name hyunmin
*/

반응형
반응형

■ Go 언어 배열

배열은 선언 및 초기화를 할때 배열에 들어갈 데이터의 타입과 길이를 설정해야 한다.

따라서, 선언한 배열의 값을 변경하는 것은 가능하지만 배열에 값을 추가하는 것은 불가능하다.


배열(Array)

예시) 5명의 국어성적이 저장되어 있는 배열의 모든값을 출력하시오.
// 또는 koreanScore := [...]int{90, 87, 56, 78, 99} 같은의미
koreanScore := [5]int{90, 87, 56, 78, 99}

for _, score := range koreanScore {        
       fmt.Println(score)    
}

■ Go 언어 슬라이스

슬라이스는 배열과 달리 선언 및 초기화 시 슬라이스의 길이를 설정하지 않아도 된다.

또한, 내장함수 append를 활용하여 슬라이스에 값을 추가할 수 있다.


슬라이스(silce)

예시) 5명의 국어성적이 저장되어 있는 슬라이스에 1명의 전학생 국어성적을 추가하고 출력하시오.
koreanScore := []int{90, 87, 56, 78, 99} 

// 전체 국어성적 슬라이스에 전학생의 국어성적인 100을 추가
koreanScore = append(koreanScore, 100)    

for _, score := range koreanScore {       
    fmt.Println(score)    
}

내장 append 함수

append 함수에 첫번째 인자는 슬라이스, 두번째 인자는 슬라이스에 추가하고자하는 값을 넣는다.
append 함수는 첫번째 인자에 해당하는 슬라이스에 직접 값을 추가하지 않고새로운 슬라이스에 값을 추가하여 반환한다.

반응형
반응형

■ Go 언어 포인터

Go 언어는 C와 C++처럼 포인터 사용을 허용하여 메모리 주소에 직접 접근할 수 있게 하지만,

버그를 유발하기 쉬운 주소 값 연산은 허용하지 않는다.

포인터의 역할은 값에 접근하는 수단일 뿐이고, 포인터 변수가 가진 주소 값을 직접 변경할 수는 없다.


■ 포인터

1. '&' 포인터 연산자

'&' 포인터 연산자는 실제 데이터가 있는 메모리 공간의 값에 접근할때 사용한다.

예시) 숫자 10을 갖고 있는 변수의 메모리 공간의 값을 호출하시오. 

* 결과는 메모리의 값을 나타내기 때문에 필자와 다를 수 있다.
pointer := 10    

fmt.Println(&pointer)

/*
※ 출력 결과
0xc000012090
*/

2. '*' 포인터 연산자

'*' 포인터 연산자는 실제 데이터의 값에 접근할때 사용한다.

예시) data라는 변수와 data 변수의 주소값 즉, 메모리 공간의 값을 갖고 있는 address라는 변수가 있을 경우
address 변수를 활용하여 data의 값을 변경하여 호출하시오. 
// 숫자 10을 갖는 변수
data := 10    

// data의 메모리 공간의 값을 갖는 변수
address := &data    

// data의 값을 10 에서 30으로 변경
*address = 30    

fmt.Println(data)

/*
※ 출력 결과
30
*/

반응형

+ Recent posts