내가 좋아해서 하는 Go 1 : Go의 기초

2021. 2. 2. 16:52내가 좋아해서 하는 Go

1. 개요

Go language가 언어의 복잡성을 줄이고, 병렬 프로그래밍에 특화된 언어라는 점을 고려하였을 때, 프로그래밍 학습의 시작을 Go language로 하는 것은 적절하지 않다.

 Generic을 곧 지원한다고 하지만, 아직 지원되지 않았고 또한 쓰레드 생성을 통한 병렬 프로그래밍 자체도 공유자원에 대한 관리와 소프트웨어 아키텍처의 이해를 바탕으로 하기 때문에, 언어의 간략함에 비해 초급자에게 적절한 언어는 아니다.

 

 따라서 앞으로의 Go에 대한 포스트에서는 초급자가 익혀야 되는 다양한 개념이나 컴퓨터 공학의 기반 지식은 이미 알고있다고 가정하고 작성한다. 물론, 간단히 언급할 수 있는 것은 하겠지만, 풀어쓰진 않는다.

 

2. Go package

javascript의 ES6, 파이썬과 유사하게 import 문을 사용하여 사용할 패키지를 명시한다.

go는 go fmt라는 도구를 활용하여, 자동으로 import 문을 추가할 수 있기 때문에 굉장히 프로그래밍이 편리하다.

//factored version
import (
    "fmt"
    "math"
)
// 위와 아래가 모두 가능
import "fmt"
import "math"

import문은 패키지 단위로도 가능하지만, 왠만하면 factored version으로 작성하자.

 

이 때, 패키지에서 export는 대문자로 시작하는 이름만이 export된다.

package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Pi)
}
// math.pi X -> math.Pi 로 사용!

 

3. Go의 변수

 

해당 출처의 내용을 정리하고, 번역해 가져온다. 출처 (blog.golang.org/declaration-syntax)

 

 

Go 는 왼쪽에서 오른쪽으로 읽는다는 행동에서 단서를 얻어 colon을 제거하고 키워드를 제거함으로 선언문을 간략하게 만들었다. 

 

명칭 타입명

 

의 구조를 지닌다.

x int
p *int
a [3]int


func main(argc int, argv []string) int

//func variable
f func(func(int, int) int, int) func(int, int) int

 

 

변수의 선언은 var이라는 키워드를 사용한다.

두가지 변수의 타입이 같다면, var x, y int 처럼 , 로 표시할 수 있다.

초기화는 3번째 줄과 같은 형식으로 할 수 있고,

만약 초기화를 하지 않는다면 각 타입에 지정되어 있는 zero value를 초기값으로 잡는다.

var x int
var x, y int
var i, j, k int = 1, 2, 3

 

선언은 :=를 사용해서 var이라는 키워드를 생략하고 사용할 수 있다. Short Assginment Statement라고 부른다. 이때, x의 타입을 할당되는 값을 통해 Inference(추론)하여 정한다.

func main() {
        x := 1
        fmt.Println(x)
}

 

Inference type을 지원하기 때문에 초기값이 존재한다면, 함수의 타입은 생략할 수 있다.

func main() {
        var x = true
        fmt.Println(x)
}

 

4. Go의 상수

상수는 var 대신 const를 사용한다. 묶어서 사용하는 것도 가능하다.

const a int = 10


const (
  a = 1
  b = "study go!"
  c = 'a'
)
fmt.Println(a, b, c)

iota라는 identifier를 사용해서, enum처럼 쓰는 것도 가능하다.

const (
    Red = iota   // 0할당
    Blue // 1할당
    Green // 2할당
)

 

5. Go의 함수

Go에서 함수는 다음과 같은 구조를 지닌다.

 

func 함수명(파라미터명 타입, ... ) (리턴변수 타입)

 

혹시 Solidity코딩을 해본 사람이 있다면, 솔리디티 언어가 Go와 함수의 정의, 선언부에서 매우 유사하다는 것을 알 수 있다.

 

아래 예시를 보면 이해가 쉬울 것이다.

// 함수명 : add 인자: x, y int 리턴타입 : int 
func add(x, y int) int {
	return x + y
}

// 반환을 이런식으로 가능하다! 반환값이 여러개이면 괄호로 묶어 명시하면 된다.
func swap(x, y int) (int, int) {
	return y, x
}



 

이 때, 반환값값의 선언부에 변수명을 입력한 이름있는 반환값 형태로 함수를 만들 수 있다.

return 에 다른 인자 값을 주지 않은(naked return)경우 명시되어 있는 값이 반환된다.

아래의 코드를 확인해보자.

func addAndSub(x, y int) (sum, sub int) {
    sum = x + y
    sub = x - y
    return
}

 

 

 

 

 

Pointers [다음 포스트 예정~!]

package main

import (
        "fmt"
)

func main() {
        var x *int
        var y int
        y = 11
        x = &y
        fmt.Println(*x)
        fmt.Println(x)
}