Go Basics

Go λ₯Ό 곡뢀해 λ³΄μ•„μš”

A huge thank you to Calvin!

What is Go Language?

  • Google이 κ°œλ°œν•œ programming language

  • 문법은 C언어와 μœ μ‚¬ν•˜μ§€λ§Œ, λ™μ‹œμ„± (Concurrency) programming을 닀루기 νŽΈν•˜λ„λ‘ 섀계됨

    • λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ°

      • web service와 같이 DBμš”μ²­μ΄λ‚˜ Network 톡신과 같이 비ꡐ적 μ‹œκ°„μ΄ 많이 κ±Έλ¦¬λŠ” 연산을 ν•˜λŠ” λ™μ•ˆ ν”„λ‘œκ·Έλž¨μ΄ λ‹€λ₯Έ 이λ₯Ό λ¨Όμ €ν•  수 μžˆλ„λ‘ 함을 의미

  • 비ꡐ적 μ΅œκ·Όμ— λ“±μž₯ν•œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ΄μ§€λ§Œ 비ꡐ적 λ³΅μž‘ν•˜μ§€ μ•Šκ³  μ‹€μš©μ μΈ μ–Έμ–΄μž„

  • Goλ₯Ό ν™œμš©ν•˜λŠ” λŒ€ν‘œμ μΈ ν”„λ‘œμ νŠΈλŠ” Docker와 Kubernetes κ°€ 있음

Why Go?

  • GoλŠ” κ°„λ‹¨ν•˜κ³  κ°„κ²°ν•œ 직관적인 μ–Έμ–΄ λ₯Ό μ§€ν–₯함

    • OOP λ₯Ό μ§€μ›ν•œλ‹€

      • class, 객체, μƒμ†μ˜ κ°œλ…μ΄ μ—†λ‹€

    • Goμ—μ„œ μ“°μ΄λŠ” ν‚€μ›Œλ“œλŠ” Java의 절반 μˆ˜μ€€μΈ 25개 밖에 λ˜μ§€ μ•ŠμŒ

      • 간단!

    • Complie μ–Έμ–΄μ§€λ§Œ compiler의 속도가 맀우 λΉ λ₯΄κΈ° λ•Œλ¬Έμ— interpreter μ–Έμ–΄μ²˜λŸΌ μ“Έ 수 있음

  • 쒋은 build system 을 κ°–κ³  있음

    • build 속도가 맀우 빠름

      • λͺ‡ μ²œμ€„μ˜ μ½”λ“œλ‘œ 이루어진 ν”„λ‘œμ νŠΈλ„ 단 λͺ‡ μ΄ˆλ§Œμ— complie ν•œλ‹€!

    • Code import κ°€ off url import κΈ°λ°˜μ΄λ‹€

      • κ·Έλž˜μ„œ dependencyλ₯Ό κ΄€λ¦¬ν•˜κΈ° μ’‹λ‹€!

        • Go module은 import μ‹œμ— url을 hash ν•  수 있게 ν•΄μ€€λ‹€

          • λ‹€λ₯Έ build systemμ—μ„œ .lock file 을 import ν•˜λŠ” 것과 μœ μ‚¬ν•¨!

Install Go on Ubuntu/Mac

1. Go 1.14 μ„€μΉ˜ν•˜κΈ°

Ubuntu

  • longsleep/golang-backports PPA λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„€μΉ˜

    sudo add-apt-repository ppa:longsleep/golang-backports
    sudo apt update
    sudo apt install golang-go

MacOS

  • golang.org μ—μ„œ package download & install

2. Go version ν™•μΈν•˜κΈ°

Ubuntu

chloe@chloe-XPS-15-9570 ~
$ go version
go version go1.14.2 linux/amd64

MacOS

~ via β¬’ v14.15.1
➜ go version
go version go1.15.6 darwin/amd64

3. Workspace μ„€μ •

  • Go projectλ₯Ό μ§„ν–‰ν•  directoryλ₯Ό μƒμ„±ν•œλ‹€

    • ex) /Users/chloe/workspace/go

  • ν•΄λ‹Ή directory 내에 μ•„λž˜μ™€ 같이 directory 3개λ₯Ό μƒμ„±ν•œλ‹€

    • bin

      • source codeκ°€ compile된 ν›„ OSλ³„λ‘œ μ‹€ν–‰ κ°€λŠ₯ν•œ binary file이 μ €μž₯λ˜λŠ” κ³³

    • pkg

      • project에 ν•„μš”ν•œ packageκ°€ compileλ˜μ–΄ library file듀이 μ €μž₯λ˜λŠ” κ³³

    • src

      • μž‘μ„±ν•œ source code 및 open source code듀을 μ €μž₯ν•˜λŠ” κ³³

4. environment variable μ„€μ •

  • GoλŠ” 2개의 environment variable을 κ°–κ³  μžˆλ‹€ - GOPATH & GOROOT

  • GOROOT

    • Go binariesκ°€ μœ„μΉ˜ν•œ κ³³

    • sudo apt install golang-go둜 μ„€μΉ˜ν•˜λ©΄ Go λ₯Ό default path에 μ„€μΉ˜ν•˜λ―€λ‘œ λ”°λ‘œ μˆ˜μ •ν•  ν•„μš” μ—†λ‹€!

      • macμ—μ„œλŠ” /usr/local/go 에 μ„€μΉ˜λœλ‹€

  • GOPATH

    • user go envirionment path

    • project file듀이 μœ„μΉ˜ν•œ 곳을 μ„€μ •ν•΄μ•Ό 함

    • go import 둜 package듀을 import ν•  λ•Œ GOPATH 둜 뢈러옴

    • 일반적으둜 $HOME/go 에 GOPATH λ₯Ό 섀정함

      • go install μ΄λ‚˜ go import λ₯Ό ν•  λ•Œ go λŠ” GOPATH λ₯Ό 찾게 λ˜λ―€λ‘œ μ€‘μš”ν•˜λ‹€!

4-1. Ubuntu $GOPATH μ„€μ •

GOPATH μ„€μ •

export GOPATH=$HOME/go

PATH μ„€μ •

export PATH=$PATH:$GOPATH/bin

4-2. MacOS $GOPATH μ„€μ •

~/.zshrc에 λ‹€μŒμ„ μΆ”κ°€ν•œλ‹€

export GOPATH="/Users/chloe/workspace/go"
export PATH="$GOPATH:$PATH"

+

$GOPATHμ„€μ • 후에 go env λͺ…λ Ήμ–΄λ₯Ό ν™œμš©ν•˜μ—¬ μ œλŒ€λ‘œ μ μš©λ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆλ‹€!

5. src in $GOPATH

  • GoλŠ” downloadν•œ code듀을 $GOPATH/src 에 downloadν•œ domain을 κΈ°μ€€μœΌλ‘œ λΆ„λ₯˜ν•΄μ„œ μ €μž₯ν•œλ‹€

    • ex) github.com, golang.org, google-golang.org, etc.

    • λ‚΄κ°€ μž‘μ„±ν•œ source codeλŠ” github.com 내에 github user name으둜 directoryλ₯Ό λ§Œλ“€μ–΄μ„œ μΆ”κ°€ν•  것이닀

Getting started with Go

1. Main package

  • package 이름을 main.go 둜 ν•œλ‹€λŠ” 것은 이 projectλ₯Ό complie ν•˜κ³ , 그것을 μ‚¬μš©ν•  κ²ƒμ΄λΌλŠ” λœ»μ΄λ‹€

    • 즉, main.go λ₯Ό μ œμ™Έν•œ λͺ¨λ“  package듀은 compile λ˜μ§€ μ•ŠλŠ”λ‹€!

  • main이 μ§„μž…μ μ΄λΌμ„œ compilerλŠ” package 이름이 main인 것 λΆ€ν„° μ°ΎλŠ”λ‹€

    • ex) package main

  • GoλŠ” func main() {} μ΄λΌλŠ” ν•¨μˆ˜λ₯Ό μ°ΎλŠ”λ‹€

    • μ—¬κΈ°κ°€ Go program의 entrypoint이닀!

  • μžλ™μ μœΌλ‘œ compilerλŠ” main package 와 κ·Έ μ•ˆμ— μžˆλŠ” main function 을 λ¨Όμ € μ°Ύκ³  μ‹€ν–‰μ‹œν‚¨λ‹€

    • ex)

      main.go

      package main
      
      import "fmt"
      
      func main() {
       fmt.Println("Hello World")
      }

2. Packages and imports

  • Goμ—μ„œ function을 export ν•˜κ³  μ‹ΆμœΌλ©΄, upper-case 둜 μž‘μ„±ν•˜λ©΄ λœλ‹€

    • ex)

      something.go

      package something
      
      import "fmt"
      
      func saySeeya() {
       fmt.Println("See ya!")
      }
      
      func SayHello() {
       fmt.Println("Hello!")
      }

      main.go

      package main
      
      import (
       "fmt"
      
       "github.com/chloe-codes1/go101/something"
      )
      
      func main() {
       fmt.Println("Hello World")
       something.SayHello()
      }

μ½˜μ†” 좜λ ₯ ν•¨μˆ˜ - println, print

좜λ ₯ 해보기

ex)

package main
import "fmt"

func main() {
 fmt.Print("Hello goorm!")
}
  • fmt package import μ•ˆν•΄λ„ print / println 은 μ‚¬μš© κ°€λŠ₯

  • println κ³Ό print λŠ” line break 유무의 차이

    • print둜 μ€„λ°”κΏˆμ„ ν•˜λ €λ©΄ μ‚¬μš©ν•˜κΈ°!

  • Single quote μ•ˆ 됨!

    • Double quote μ‚¬μš©ν•˜κΈ°

  • print ν•¨μˆ˜λ“€μ€ ν•¨μˆ˜ μ•ˆμ—μ„œμ˜ μ—°μ‚° κ²°κ³Όλ₯Ό 좜λ ₯ ν•  수 있음!

    ex)

    package main
    
    func main() {
      var num1 int = 1000
      var num2 int = 1413
    
      println("λ§μ…ˆμ„ ν•΄λ³΄μ•„μš” ~ ", num1 + num2)
    }
    chloe@chloe-XPS-15-9570 ~/Workspace/Go/Go101
    $ ./calc
    λ§μ…ˆμ„ ν•΄λ³΄μ•„μš” ~  2413

fmt package

  • μž…μΆœλ ₯을 μœ„ν•œ package

  • μ‚¬μš©λ²•

    • package main 밑쀄에 import "fmt" μž‘μ„±

+

Last updated

Was this helpful?