Go 언어 배워보기 - 기초문법 1

2022.12.18

본 글은 A Tour of Go예제로 배우는 Go 를 다시 정리한 글입니다람쥐.


한동안 일에 치이며 살면서 그저 출근-퇴근-집에와서는 아무것도 안함 만 반복하다 내 인생을 너무 허비하고있다 라는 생각이들어
뭐라도 배워야겠다 싶어서 Go를 공부해보기로 했다. 한동안 js에 길들여져 다른 언어를 배우는대 적응이 필요했지만 새로운 배움은 언제나 신선하다.
잡담은 여기까지고 복습과 기록을 남길겸 기초적인 Go 문법을 다시한번 정리하였다.


변수와 상수


var 키워드로 변수를 선언할수있다. 선언은 var (변수명) (타입) = (값) 순서로 작성한다.

package main

import "fmt"

func main() {
	var num int = 10
	fmt.Println(num)
}

또는 := 라는 짧은 변수 선언 문법으로 아래와 같이 작성할수도 있다.


package main

import "fmt"

func main() {
	num := 10
	fmt.Println(num)
}

이렇게 짧게 변수 선언을 했을경우에는 암시적으로 할당된 값의 타입으로 지정된다.


str := "문자열"     //자동으로 string이 됨
num := 123        //자동으로 int가 됨

한번에 여러개의 변수 할당도 가능하다.


var num1,num2 int = 1,2
num3,num4 := 3,4

const 키워드로 상수 할당을 할수있다.


const MAX int = 10
const MIN = 2     //자동으로 int

상수를 선언할때 괄호로 묶어서 한번에 여러개 선언 하기


const (
    max=10
    min=2
    someText="문자열"
    )


변수 사용시 주의사항


변수 선언시 초기값을 지정해 주지 않는다면 Go에서는 기본값을 할당한다.

var num int        //숫자형에는 0
var str string    //문자열은 ""
var isTrue bool    //Boolean은 false

짧은 변수 선언은 함수 안에서만 사용할수있다. 함수 외부에서는 반드시 var나 const 같은 키워드로 시작해야한다.


import "fmt"

num := 12        //에러

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


Go의 데이터 타입


boolean 타입
bool        

문자열
string

정수형
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr

소수형
float32 float64 complex64 complex128

기타
byte    //uint8 과 동일
rune    //int32 와 동일 유니코드의 코드포인트로 사용됨


문자열


(" ") 와 (` `) 으로 문자열을 할당할수있다.
백틱(`) 으로 감싼 문자열은 원시 문자열(raw string)이라 부르며 이스케이프 등의 별다른 해석없이 있는 문자열 그대로 출력된다.

package main
 
import "fmt"
 
func main() {
    rawString := `백틱으로 된 문자열이다/n
    /n 과 같은 구문은 해석되지 않으며 이 코드상의 줄 앞에 있는 들여쓰기 까지 그대로 적용된다.`
    interpretedString := "큰따옴표로 된 문자열은 \n"+
                        "\\n 과 이스케이프문이 해석되며 + 로 여러줄에 거쳐 쓸수 있다."
 
    fmt.Println(rawString)
    fmt.Println()
    fmt.Println(interpretedString)
}

백틱으로 된 문자열이다/n
    /n 과 같은 구문은 해석되지 않으며 이 코드상의 줄 앞에 있는 들여쓰기 까지 그대로 적용된다.

큰따옴표로 된 문자열은 
\n 과 이스케이프문이 해석되며 + 로 여러줄에 거쳐 쓸수 있다.

출력 결과

데이터 타입 변환


타입(값) 으로 타입 변환이 가능하다.

package main

import "fmt"

func main() {
	num1 := 10.2    //float64 형이다
	num2 := int(소수)    //int() 로 int 타입으로 변환했다
	
	fmt.Println(num1,num2)    //출력결과: 10.2 10 
	fmt.Printf("%T %T",num1,num2)    //float64 int
}

연산자


어느 언어에서나 다를것 없는 연산자는 생략하였다.
그래도 확인하고 싶다면 이 문서를 읽어보자.


조건문


if문


Go에서의 if문은 조건문의 소괄호( ) 를 생략할수 있지만 중괄호{ } 는 반드시 필요하며 중괄호는 if 와 같은줄에서 열어야 한다.
또 조건식은 반드시 Boolean 타입이어야 한다. 다른 언어들이 if (0) 또는 if (1) 처럼 숫자로 처리할수있는것과는 차이가 있다.

if someValue > 10 {
    //실행할 구문
}

//아래와 같은 if문은 오류가 발생

if (0) {
    //다른 언어에서는 false로 간주하지만 Go에서는 에러 발생
}

if (max > 10)
    return    //Go에서 { } 는 필수

if (max > 10) 
{
    //if문의 블럭이 시작되는 중괄호는 반드시 if 와 같은 줄에서 열어야 한다.
}

조건을 검증하기전에 if (실행할 문장) ; (조건식) {} 형태로 간단한 식을 실행할수도 있다.


if value := 2 * 5 ; value > 10 {}    //if문에서 바로 변수를 선언하고 2를 곱한다음 10보다 큰가를 확인하고 있다.

또한 이렇게 if문 안에서 선언된 변수는 if와 else 블럭 어디서든 참조가 가능하지만 블럭 스코프를 벗어나면 사용할수 없다.


if value := 10 ; value > 10 {
    //value 값 확인 가능
}else{
    //여기서도 value값에 접근할수있다
}

value=20    //if 밖에서 value에 접근하면 에러가 발생한다.

switch문


go의 switch문은 다른언어와 차이점이 많다. 가장먼저 if문과 마찬가지로 검증할 값 앞에 간단한 식을 사용할수 있다.

switch value := 1 ; value {
    
}

break 문이 필수가 아니다. go 컴파일러가 자동으로 break를 삽입해준다.
다른 언어에서는 case에 break가 없으면 다음 case로 넘어가지만 go에서는 switch문을 빠져나간다.


switch value := 1 ; value {
    case 1:
    //실행할 구문 1
    case 2:
    //실행할 구문 2
    default:
    //...    
}

만약 다른언어들 처럼 switch문을 빠져나가지 않고 계속해서 다음 case문으로 가려면 `fallthrough` 문을 사용한다.
switch {
    case 1:
    //fullthrough 문이 있다면 다음 case로 이동
    fullthrough
    case 2:
    //아래의 default까지 도달
    fullthrough
    default:
    //...    
}

case 문에 여러개의 값을 적을수 있다. 다른언어에서의 case 문을 여러개 붙여서 쓰는 동작과 똑같다.


switch (...) {
    case 1:
    //1일때 실행할 구문
    case 2,3:
    //2또는 3일때 실행할 구문
    
    //...
}

switch 에서 조건을 생략할수도 있다. 이렇게 하면 일단 true로 간주하고 첫번째 case문으로 내려가며 일치하는 case를 만나면 switch문을 빠져나간다.
이런 방법으로 복잡한 if-else 간략하게 작성할수도 있다.
추가적으로 case문 자체에 식을 작성할수도 있다.


var value int = 2
switch {
    case value==1:    //case문 자체에 식(expression)을 사용했다.
    //1일때
    case value==2:
    //2일때
    
    //...
}

Do you want something exciting?

© 2022. YSH All rights reserved.