Mac에서 Go 설치하기

Olivia·2024년 1월 18일
1

[Go]

목록 보기
1/4
post-thumbnail

Go 설치 가이드 🚀

Mac 환경에서 Go 설치 이제 어렵지 않다. 주니어 개발자. 더 이상 go 설치에 당황하지 않는다.

⚠️ 첫 설치 내용은intel로 시작합니다. 에러를 만난 뒤 재설치하는 과정은 M1, M2, M3를 위한 설치 과정을 정리해뒀습니다.


1. 설치 파일 다운로드 및 실행

brew / Go 홈페이지에서 go를 다운받는 방법 2가지가 있다.

Brew를 통한 go 설치

  1. brew update를 통해 업데이트를 체크하고 brew install 명령어로 golang을 설치한다.

    $ brew update
    $ brew install go
  2. 설치가 완료되면 go 버전을 확인해 정상적으로 설치되었는지 확인한다.

    $ go version


    현재 intel를 사용하기 때문에 amd64가 뜨는 것이다.


Go 홈페이지를 통한 go 설치

  1. Go 다운로드 페이지로 접속하여 설치 파일을 다운로드 한다.
    특정 버전이나 개인의 OS환경에 맞춰 해당 대상을 찾아 다운로드 한다. (현재 버전 1.21.6)

https://go.dev/doc/install

  1. 설치가 완료되면 go 버전을 확인해 정상적으로 설치되었는지 확인한다.

    $ go version

2.1 또는 go env를 입력 후 아래와 같은 결과 값이 나온다면 정상적으로 Go가 설치된 것.

$ go env

에러 발생시 🤯

1. ERROR : zsh: command not found: go

만약, go version 명령어를 입력했을 때 zsh: command not found: go 에러가 발생한다면, 환경변수 설정 문제로 인해 발생한 것이다.
직접 PATH에서 go 커맨드가 위치한 경로를 추가해야한다.

// zshrc 파일 생성
$ touch ~/.zshrc

// zshrc 파일 열기
$ vim ~/.zshrc

// 환경변수 추가
export GOROOT="/usr/local/go"
export GOPATH=$GOROOT/gopath
export GOBIN=$GOPATH/bin
export PATH=${PATH}:$GOROOT/bin
export PATH=${PATH}:$GOBIN

// 변경사항 적용
$ source ~/.zshrc

// echo를 통해 환경변수가 제대로 등록되었는지 출력
$ echo $GOROOT
/usr/local/go
$ echo $GOPATH
/usr/local/go/gopath
$ echo $GOBIN
/usr/local/go/gopath/bin

2. ERROR : go.mod compile error

Intel에서 M3로 마이그레이션 후 go를 실행하는데, 계속 go.mod에서 comile 에러가 발생함.
ERROR: packages.Load error: err: exit status 2: stderr: go: no such tool "compile"go list


처음 내가 확인한 것.

1. go가 amd64 인지 arm64 인지 확인.

$ go version

apple칩일 경우 반드시 arm64가 나와야한다.
그러나 나는 amd64로 나온것으로 봐 intel에서 설치했던 go라 생각했기 때문에 go를 삭제하고 재설치해야겠다고 생각했다.

2. go를 설치하기 전 homebrew 확인

brew역시 intel에서 설치했던것이라 생각해 brew 설치 경로를 확인했다.
homebrew를 확인하지않고 무작정 go를 삭제 및 설치하니 계속 cmd64로 설치되었기 때문.

which brew
  • intel인 경우: /usr/local/bin/brew
  • apple인 경우: /opt/homebrew/bin/brew

나의 경우 brew 역시 intel로 설치되어있음을 확인했다.


go & Homebrew 재설치

🚨 재설치전에 반듯이!!!!!!! DB는 백업을 시켜놓자...!!! 🚨

postgresql을 사용하는데 자꾸 local이랑 연결이 안되어서 뭐가 문젠가 하고 봤는데...
Homebrew를 재설치하면서 postgresql도 날아가있었다...🥲

다시 postgres 다운받았으나 데이터는 하나도 남아있지 않았던 상태...!
다행히도 운영중이던 서버에서 백업시켜논게 있어서 그걸로 복구 시켰다..!

homebrew 삭제 및 재설치

1. homebrew 삭제

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"

2. homebrew 재설치

apple silicon (m1-m3) 기준

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

3. homebrew 환경 변수 설정

nano ~/.zshrc
또는
vim ~/.zshrc

아래의 내용을 추가하거나 변경시킨다.

export PATH="/opt/homebrew/bin:$PATH"

4. homebrew 환경 변수 변경사항 적용

source ~/.zshrc

5. homebrew 설치 확인

brew --version

정상적으로 설치되었을 경우, Homebrew 버전로 출력된다.


go 삭제 및 재설치

1. Go 설치 경로 확인

which go

2. Go 삭제

sudo rm -rf go-설치-경로
ex) sudo rm -rf /usr/local/go

3. 환경 변수 정리

nano ~/.zshrc
또는
vim ~/.zshrc
Go와 관련된 환경변수를 제거해야한다.
예를들어 export GOROOT 또는 export PATH와 관련된 Go 경로를 
모두 제거한 후 파일을 저장하고 닫았다.

4. 환경 변수 파일 업데이트

source ~/.zshrc

5. Go 설치

위에 작성한 내용을 다시 확인하여 재설치하면 된다.

이번에 나는 homebrew로 설치했다.

brew install go

go version

M1 - M3의 경우 go version go1.xx.xx darwin/arm64 로 나와야 한다.

6. 환경 변수 설정

export GOROOT="/opt/homebrew/opt/go@1.22/libexec"
export PATH="/opt/homebrew/opt/go@1.22/bin:$PATH"
export PATH=$PATH:$HOME/go/bin

go 프로젝트 위치확인

진짜 오랜만의 Go라서 세상 멍청한 짓을 많이했다. git clone으로 go 프로젝트를 클론받고난 뒤, 그냥 /desktop/goProject 폴더에 클론받은 것...🙄🤦‍♀️

Go 언어는 GOPATH 라는 경로를 통해 소스 코드와 패키지를 찾는다.
따라서 처음 Go를 설치할 때, 기본적으로 ~/go 폴더를 GOPATH로 사용한다.
그렇기 때문에 Go 폴더에 프로젝트를 넣어야한다...

그렇다면 도대체 이 Go 폴더를 어떻게 찾아야할까..?

🙃 진짜 계속 혼란의 연속이였다. 똥멍청이짜식...💩
내가 쓴 글 읽어보니 아래 workspace에다가 정리를 해 놨었다.. ㅎㅎㅎㅎ 내 글 내가 안읽어서 생긴 문제..🙃

Go 폴더 찾기
기본적으로 go는 /Users/사용자이름 안에 go 폴더가 있다.

사용자 이름이 뭔지 아는 분들은 해당 파일에 들어가 go 폴더를 찾으면 되고, 모르는 분들은 아래의 명령어로 해당 폴더를 열어보면 된다.

사용자 이름 찾기:

whoami

go 폴더 한 번에 열어버리기:

$ open /Users/$(whoami)/go

그렇다면 go 폴더가 짜잔하고 자동으로 열릴 것이다..!!!

해당 폴더 아래 src 폴더를 만든 후 그 안에 프로젝트를 옮기면 된다.

/Users/Olivia/go/src/goProject

마지막으로 go 모듈 파일(go.mod)을 정리한다.

go mod tidy

이로써 packages.Load error: err: exit status 2: stderr: go: no such tool "compile"go list 에러 해결..!!!


workspace 👩🏻‍💻

💡 Workspace란,
여러개의 go module들을 일일이 go.mod 파일로 수정할 필요 없이 관리할 수 있게 해주기 때문에, workspace 내 모듈들은 각자가 root moudle로 취급된다.
Go 코드는 단일 workspace에서 관리되며, workspace에는 여러개의 프로젝트가 하위에 들어갈 수 있다.

Go 설치 이후에는, mac을 기준으로 `/Users/${USER}/go` 라는 폴더가 생성된다.
- `/Users/${USER}/go/bin` << 실행 파일들이 모여 있음
- `/Users/${USER}/go/pkg` << 패키지 파일들이 모여 있음

프로젝트 생성

단일 workspace인 /USER/${USER}/go 디렉토리에서 모든 프로젝트의 모음 폴더src를 생성해준 뒤 하위에 각 프로젝트들을 구성하는 방식.

  1. workspace로 이동

    $ cd /Users/${USER}/go

    에러 발생시

    만약, 위의 디렉토리로 이동할 수 없을 경우(go 폴더가 생기지 않은 경우) 다음과 같이 해결할 수 있다.

    1. 설치가 제대로 되어있는지 확인

      // 경로 확인
      $ which go
      
      // 설치 확인
      $ go
      
      // 환경설정이 되어있는지 확인
      $ go env
    2. go 폴더가 여전히 존재하지 않을 경우 사용자의 홈 디렉토리로 이동하여 go 폴더를 직접 생성한 뒤 내부 폴더들을 생성한다.

      $ cd
      
      // go 폴더 생성
      $ mkdir go
      
      // go 폴더에 3개의 폴더 생성하는 명령어
      $ mkdir -p $HOME/go/{bin,src,pkg}
  2. go 소스파일 집합인 src 생성 및 src 디렉토리로 이동

    // src 생성
    $ mkdir src
    
    // src로 이동
    $ cd src
  3. src 디렉토리에서 프로젝트 클론
    단, 폴더 이름에 하이픈(’-’)을 포함하면 일부 언어나 프레임워크에서 호환성의 문제가 발생할 수 있기 때문에 변경해주는 것이 좋다.

    ```bash
    $ git clone 주소 폴더명
    ```
  4. 해당 프로젝트 레포지토리로 이동 후, 패키지에 대한 모듈 생성을 해준다.

    $ go mod init 이름-go
  5. 모듈의 모든 패키지에 대한 종속성 제거 및 업데이트가 필요하다.
    소스 코드를 확인해 import되지 않는 모듈들을 자동으로 go.mod 파일에서 삭제하고 import되었지만, 실제 모듈이 다운안된 경우 go.mod 파일에 추가한다.

    ```bash
    $ go mod tidy
    ```
  6. Extension 설치

    go 코드를 디버깅하기 위해서 GO extension을 설치해야한다.

    6.1 Go 플러그인⌘ + ⇧ + p을 전체 선택해서 업데이트한다.


  7. launch.json 설정

    개발 시, 디버깅 모드에 요구되는 launch.json
    기본 launch 모드와, test 모드 중 선택하여 디버깅할 수 있다.

    {
      // Use IntelliSense to learn about possible attributes.
      // Hover to view descriptions of existing attributes.
      // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
      "version": "0.2.0",
      "configurations": [
        {
          "name": "Launch Package",
          "type": "go",
          "request": "launch",
          "mode": "auto",
          "program": "${workspaceFolder}/main.go",
          "args": [
            "observe",
            "--not",
            "--from-label",
            "reserved:world",
            "--since",
            "1m",
            "--last",
            "1000"
          ]
        },
        {
          "name": "Test Current File",
          "type": "go",
          "request": "launch",
          "mode": "auto",
          "program": "${file}",
          "env": {},
          "args": []
        }
      ]
    }

    test 모드 이용 예시

    • string_util.go >> string_util_test.go 복제
    • 해당 API의 parameter에 들어올 값을 커스텀해서 단위 테스트를 진행한다.
      // string_util.go
      
      package util
      import "strings"
      
      func CreateNamesMap(names []string) map[string]string{
      	nameMap := make(map[string]string)
      	for -, name := range names {
      		namesMap[name] = "--from-namespace"
      	}
      	return nameMap
      }
      // string_util_test.go
      
      package util_test
      import (
      	"skuber-go/utils"
      	**"testing"** // testing import
      )
      
      func TestCreateNamesMap(**t *testing.T**){ // 파라미터에 testing mode 적용
      	names := **[]string{"d", "e", "f"}** // custom value를 넣어 단위 테스트
      	s := utils.CreateNamesMap(name)
      	if len(s) > 0 {
      		t.Error("wrong result")
      	}
      }

references
https://dksshddl.tistory.com/entry/Go-Go-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0%EC%BD%94%EB%93%9C-%EA%B5%AC%EC%A1%B0-package

profile
👩🏻‍💻

0개의 댓글