Golang 기본 문법

2021. 11. 9. 18:52Programming/JAVA, C++, Go, Rust

    목차
반응형

1. 변수

1.1 변수 선언

var a int
var f float32 = 11.

a = 10
f = 12.0

사용되지 않는 변수는 error가 발생한다.
아래와 같이 선언만 하고 사용하는 코드가 작성되지 않는다면 error가 발생한다.

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

:=로 변수의 선언과 할당을 동시에 수행 할 수도 있다.

val := 10

1.2. 상수

var 대신 const를 사용하여 변수를 선언하면 '상수'로서 선언된다.
C++의 const와 동일한 keyword를 사용한다. (Kotlin의 경우 val keyword)

const c int = 10
const s string = "Hi"

Go는 type deduction을 지원한다.
변수 명 뒤에 변수의 type을 지정하지 않고 바로 '값'을 할당 시, 할당되는 값을 통해 type을 '유추'(deduction)한다.

const c = 10
const s = "Hi"

여러 상수들을 '('로 묶어서 한번에 선언 할 수도 있다.

const (
    visa = 'visa'
    master = 'master'
)

상수값을 0부터 순차적으로 부여할 수도 있다.

const(
    APPLE = iota    // 0
    GRAPE           // 1

1.3. go data types

| bool | boolean type 이다. | true/false의 값을 갖는다 |
| string | | |
| int | 일반적인 integer type | |
| int8 | 8-bit integer | |
| int16 | | |
| int32 | | |
| int64 | | |
| float32 | | |
| float64 | | |
| complex64 | | |
| complex128 | | |
| byte | uint8과 동일 | |
| rune | int32와 동일 | Unicode에 사용 |

1.4. 문자열

back quote

raw string literal

` `로 둘러쌓인 경우
raw sring literal이며 raw string 그대로의 값을 갖는다.
\n이 안에 있을 시 NewLine으로 해석되지 않는다.

double quote

""인 경우
interpreted string literal

복수 라인에 걸쳐 쓸 수 없다.
escape 문자열들은 특별한 의미로 해석된다.

package main

import "fmt"


func main() {
    rarw_string_literal := \'test1\n
test2\n
    test3`

    inter_string_literal := "test2\ntest2"

    fmt.Println(raw_string_literal)
    fmt.Println(inter_string_literal)
}

출력 결과

test1
test2
  test3
test2
test2

1.5. type conversion

var i int = 100
var u uint = uint(i)

var f float32 = float32(i)

println(f, u)

:= 으로 할당하면, type까지 정함

str := "abc"
bytes := []byte(str)
str2 := string(bytes)

println(bytes, str2)

1.6 print

package main

import(
    "fmt"
)

func main() {
    st := User{"name", 10}

    fmt.Println("a", 10, 10, "b")  // a 10 10 b

    fmt.Printf("%v\n", st) // {name, 10}
    fmt.Printf("%#v\n", st)  // main.User{Name:"name", Age:"10"}
    fmt.Printf("%+v\n", st)  // {Name:name Age:10}
    fmt.Printf("%T\n", st)   // main.User
}

2. 연산자

사칙 연산자

c = (a + b)/5;
i++;

비교 연산자

a == b
a != c
a >= b

논리 연산자

A && B
A || !(C && B)

bit 연산자

c = (a & b) << 5

단항 연산자

a = 100
a *= 10
a >>= 2
a |= 1

2.2. 포인터 연산자

C++의 &, * 처럼 주소를 얻거나 반대로 dereference시 사용한다.
단, C처럼 pointer에 산술 연산을 적용할 수는 없다.

var k int = 10
var p = &k

println(*p)    // 10

2.3. 조건문

if k == 1 {
    println("1")
}

else 문

if k == 1 {
    println("1"
} else if k == 2 {
    println("2")
} else {
    println("else")
}

if 문에서 조건식 이전에 할당문을 줄 수 있다.
해당 할당된 변수는 조건문 내에서만 유효한 scope를 갖는다.

if val := i*2; val < max {
    ...
}

switch

go의 switch에는 break가 없다. 기본 반영이다.

switch val {
case 1:
    output = "1"
case 2:
    output = "2"
case 3, 4:
    output = "3 or 4"
default:
    output = "default"
}

println(output)

switch expression 내에서도 할당이 가능하다.

switch val := input*2; val - 1 {
   ...
}

switch 뒤에 expression이 없을 수 있다.
이 경우 if else 대신 사용하기 좋다.

switch 
case val == 1:
    ...
case val == 2:
    ...

type을 switch expression 내에서 사용 가능하다.

switch v.(type) {
case int:
    println("int")
case bool:
    println("bool")
}

fallthrough

go의 switch 문법에 break가 기본 적용되기에, fallthrough을 하려면 (타 언어와 반대로) fallthrough keyword를 사용해야 한다.

switch val {
case 1:
    printlnk("1")
    fallthrough
case 2:
    print("2")
}

2.4. for 문

for 문 내에서는 var로 변수를 초기화 할 수 없다.
대신 :=를 사용한다.

for i := 0; i < 10; i++ {
    val += 1
}
n := 10

for n > 0 {
    n -= 1
}

infinite loop

for {
    ...
}

for range

names := []string{"a", "b"}

for idx, name := range names {
    println(name)
}

break, continue, goto

break의 사용

for {
    if i > 10 {
        break
    }
}

continue의 사용

for {
    if queue.isEmpty() {
        // wait for 1 sec.
        continue
    }
}

continue의 사용

for {
    if val == 1 {
        // handle ...
        continue
    }        
}

goto의 사용

if ERROR == job1() {
    goto END;
}

...

END:
...
반응형

'Programming > JAVA, C++, Go, Rust' 카테고리의 다른 글

go 언어로 web server 만들기 1 (고 언어 웹 서버)  (0) 2021.12.30
go generic (고 언어 제네릭)  (0) 2021.12.22
Go empty interface  (0) 2021.12.09
Golang slice, map, struct  (0) 2021.11.09
Golang introduction  (0) 2021.11.09