본문으로 건너뛰기

Go Tour-1

Go Tour​

패키지​

고랭(Go Lang)으로 작성된 프로그램은 모두 패키지로 구성되어있으며, 패키지명은 디렉토리 경로의 마지막껄 사용한다.

e.g) path/filepath 일 경우 패키지명은 filepath 이다.

패키지 임포트​

  • 패키지 임포트는 소괄호로 감거나, import 문장을 여러번 사용할 수 있다
import (
"fmt"
"math"
)
import "fmt"
import "math"

패키지 익스포트​

  • 패키지를 임포트하면 패키지 내에서 익스포트 한 메소드, 상수등에 접근할 수 있다.
  • 변수명, 함수명의 첫글자가 대문자로 시작하면 외부에서 접근이 가능해진다.
- Foo (o)
- FOO (o)
- foo (x)

함수​

  • C, C++, Java와 다르게 매개변수를 오른쪽에 명시해준다.
    • 오른쪽에 명시하는 이유를 간단히 설명하자면, 코드를 왼쪽에서 오른쪽으로 자연스럽게 읽기 위해서라고 한다.
import "fmt"

func add(x int, y int) int {
return x + y
}

func main() {
fmt.Println(add(1,2))
}
  • 매개변수의 타입이 같을경우, 마지막 매개변수의 타입만 명시하고 나머지는 생략이 가능하다
func add (x, y int) int {
return x + y
}
  • 함수내에 여러개의 결과를 반환할 수 있다
func swap(x, y String) (String, String) {
return y, x
}
  • 반환값에 이름을 명시해둘 경우 변수처럼 사용이 가능하며, 반환값을 지정하진 return 문에 자동으로 처리된다
func division (sum int) (result int) {
result = sum / 2
return
}

변수​

  • 변수는 var 키워드를 사용한다
  • 함수의 매개변수와 같이 변수명 뒤에 타입을 명시한다
  • 값을 초기화 할 경우 초기화 한 값의 타입이 자동으로 결정된다
var x, y, z int
var python, java, node = true, false, true
  • 함수 내에서 변수 선언을 간단하게 사용이 가능하다
func main () {
x, y, z := 1, 2, 3
}
  • 상수는 const 키워드를 사용하며, (문자열, Bool, 숫자) 타입만 선언할 수 있다
  • 임포트처럼 소괄호로 묶어서 사용할 수 있다
import "fmt"

const Pi = 3.14

const (
Big = 1 << 100
Small = Big >> 99
)

func main () {
fmt.Println(Pi)
}

반복문​

  • Go에서는 반복문은 for 만 사용한다.
  • 사용법은 C, Java 와 유사하며, 소괄호는 생략한다
import "fmt"

func main () {
sum := 0
for i := 1; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
  • 조건부만 사용할 수 있다 ( While문 )
import "fmt"

func main () {
sum := 0
for sum < 100 {
sum += 5
}
fmt.Println(sum)
}
  • 조건부도 생략하면 무한루프가 된다
import "fmt"

func main () {
for {
fmt.Println("으악! 무한루프다")
}
}

조건문​

  • 조건문은 C, Java 와 유사하게 사용이 가능하며, 반복문과 마찬가지로 소괄호는 생략한다
import "fmt"

func odd (num int) bool {
if num / 2 == 1 {
return true
} else {
return false
}
}

func main () {
fmt.Println(odd(3))
}
  • 조건문 앞에 변수를 선언할 수 있으며, 여기서 선언된 변수는 if, else 문 내의 스코프에서만 유효하다
import "fmt"

func odd (num int) bool {
if b := num / 2; b == 1 {
return true
}
// Undefined: b
// fmt.Println(b)
return false
}

func main () {
fmt.Println(odd(3))
}

타입​

기본 자료형은 아래와 같다

  • bool
  • string
  • int
    • int, int8 int16 int32 int64
    • uint uint8 uint16 uint32 uint64 uintptr
  • byte (uint8 alias)
  • rune (int32 alias)
  • float
    • float32 float64
  • complex
    • complex64 compl128

구조체​

struct 키워드를 통해 구조체를 만들 수 있으며, type 선언으로 구조체의 이름을 지정할 수 있다

import "fmt"

type User struct {
name string
age int
}

func main () {
user := User{"서동명", 21}
fmt.Println(user.name)
}

포인터​

  • 포인터는 있지만, 포인트 연산은 불가능하다
  • 구조체는 구조체 포인터로 접근이 가능하며, 실제 구조체에 직접적인 영향을 끼친다
import "fmt"

type User struct {
name string
age int
}

func main () {
user := User{"서동명", 21}
p := &user
p.name = "누군지 모르겠어"
fmt.Println(user.name)
fmt.Println(p.name)
}
  • 구조체 리터럴
    • {key: value} 형태로 값을 설정할 수 있다 (순서는 상관없다)
    • & 키워드를 통해 구조체 리터럴 포인터를 생성할 수 있다
import "fmt"

type User struct {
name string
age int
}

func main () {
user := User{"서동명", 21}
user1 := User{name: "누굴까"}
user2 := &User{age: 21}
fmt.Println(user.name)
fmt.Println(user1.name)
fmt.Println(user)
fmt.Println(user1)
fmt.Println(user2)
}

new 함수​

  • new(T) 는 모든 값이 0 (Zero Value) 로 할당된 타입의 포인터를 반환한다
    • 숫자 타입은 0, 참조 타입은 nill
import "fmt"

type User struct {
name string
age int
}

func main () {
user := new(User)
fmt.Println(user)
user.name = "서동명"
fmt.Println(user)
}