Go-Lang Syntax

발표자 이동환

  • ## Go program 필수 사항

    go 프로그램을 작성할때 반드시 패키지 선언(package declaration)으로 시작해야된다고 함.


In [ ]:
package main

import "fmt"

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

golang에서 사용되는 Keyword

break, default, func, interface, slelect, case, defer, go, map, struct, chan, else, goto, package, switch, const, fallthrough, if, range, type, continue, for, import, return, var

연습문제

  1. 공백이란 무엇인가?

    ==> 줄바꿈, 빈 칸, 탭으로 공백 표현

  2. 주석이란 무엇인가? 주석을 작성하는 두 가지 방법은?

    ==> //로 시작하는 줄은 주석처리. ==> //와 / comment / 두가지 방법으로 처리.

  3. 앞에서 작성한 프로그램은 package main으로 시작한다. fmt 패키지 안에 포함된 파일은 무엇으로 시작하겠는가?

    ==> package fmt

  4. 앞에서는 fmt 패키지에 정의된 Println 함수를 사용했다. os 패키지에 포함된 Exit 함수를 사용하고 싶다면 어떻게 해야 하는가?

==> package os os.Exit()

타입

1. 숫자

- 정수

uint8(byte)     ==> 0 to 255 
uint16          ==> 0 to 65535
uint32(rune)    ==> 0 to 4294967295
uint64          ==> 0 to 18446744073709551615
int8            ==> -128 to 127
int16           ==> -32768 to 32767
int32           ==> -2147483648 to 2147483647
int64           ==> -9223372036854775808
                    to  9223372036854775807

장비에 의존적인 정수 타입 : uint, int uintptr

- 부동 소수점 수

float32         ==> 32-bit floating-point numbers
float64         ==> 64-bit floating-point numbers

complex64       ==> float32 real and imaginary parts
complex128      ==> float64 real and imaginary parts


2. 문자열

""으로 표현하거나 ``(역따음표)으로 표현

""으로 표현하게 되면 줄바꿈을 포함할 수 없고, 특별한 이스케이프 문자열 사용 가능(예: \n or \t)

fmt.Println("Hello World"[1])  ===> 출력결과 101 // 이유는 문자가 바이트로 표현되기 때문(e는 아스키코드로 101).

In [3]:
fmt.Println("Hello World"[1])


Out[3]:
101
4
<nil>

3. 불린

표현 의미
&& and
|| or
! not

연습문제

  1. 정수는 컴퓨터에 어떻게 저장되는가?

    ==> 2진수로 저장.

  2. 우리는 (십진수 체계에서) 가장 큰 한 자리 숫자는 9이고, 가장 큰 두 자리 숫자는 99라는 사실을 알고 있다. 이진수에서 가장 큰 두 자리 숫자는 11(3)이고, 가장 큰 세 자리 숫자는 111(7)이며, 가장 큰 네 자리 숫자는 1111(15)라는 사실을 고려했을 때 가장 큰 8자리 숫자는 무엇인가? (힌트: 10¹-1 = 9이고 10²-1 = 99다)

    ==> 11111111(2) ==> 2^9-1 ==> 511

  3. 작업에 비해 조금 과도한 감이 있긴 하지만 Go를 계산기로도 쓸 수 있다. 321325 × 424521를 계산해서 그 결과를 터미널에 출력하는 프로그램을 작성하라. (곱셈을 위해 * 연산자를 사용한다)

    ==>

  1. 문자열이란 무엇인가? 문자열의 길이를 구하는 방법은 무엇인가?

    ==> ""또는 ``으로 표현된 것. len("hello world~?")

  2. 다음 수식의 값은 무엇인가? (true && false) || (false && true) || !(false && false)

    ==> false || false || true ==> true

변수

기본적인 변수 정의

var name string

변수는 var 키워드를 이용하여 만들어지고 그 다음으로 변수의 이름(name) 그리고 타입(string)으로 이루어져 있다.

축약 형태

helloworld := "Hello world!"

:= 형태로 축약이 가능하며, Go 컴파일러가 변수에 할당하는 값을 토대로 타입을 추론하기 때문에 타입 선언이 필요하지 않다.

유효 범위

go는 C언어와 동일하게 유효범위(Scope)를 갖기 때문에 블록에 포함된 범위까지만 유효하다.

상수

go는 상수(constant)를 지원한다. 상수는 변수와 같은 방식으로 만들어지지만, var키워드 대신에 const 키워드를 사용한다.

여러개의 변수 정의


In [1]:
a, b, c := 80, 100, 120

fmt.Println(a,b,c)


Out[1]:
80 100 120

In [1]:
var d, e, f string
d = "Hello"
e = "World"
f = "!"
fmt.Println(d+e+f)


Out[1]:
HelloWorld!

In [1]:
var (   
    g=10
    h=12
    i=0
)
fmt.Println(g, h, i)


Out[1]:
10 12 0

연습문제

  1. 새로운 변수를 생성하는 두 가지 방법은 무엇인가?

    ==> var name variableType name := value

  1. 다음 코드를 실행한 후 x의 값은 무엇인가? x := 5; x += 1

    ==> 6

  2. 유효범위란 무엇이고 Go에서는 변수의 유효범위를 어떻게 결정하는가?

    ==> 변수를 사용 할 수 있는 공간 // 블록으로 결정

  3. var와 const의 차이점은 무엇인가?

    ==> var는 일반적인 변수 정의 할 때 사용 // const는 상수 정의 할 때 사용

  4. 예제 프로그램을 출발점으로 삼아 화씨를 섭씨로 변환하는 프로그램을 작성하라. (C = (F - 32) * 5/9))

    ==>

  5. 피트를 미터로 변환하는 프로그램을 하나 더 작성하라. (1 ft = 0.3048 m)

    ==>

제어 구조

for 문 표현

"for" [ condition | ForClause | RangeClause ] Block

condition = expression


In [1]:
a := 8
b := 20

for a < b {
    a *= 2
    fmt.Println(a)
}


Out[1]:
16
32

무한 루프 표현

for {

expression

}

ForClause = [ IinitStmt ] ";" [ Codition ] ";" [ PostStmt ]


In [1]:
for i := 0; i < 10; i++ {
    fmt.Println(i)
}


Out[1]:
0
1
2
3
4
5
6
7
8
9

RangeClause = [ ExpressionList "=" | IndentifierList ":=" ] "range" expression


In [2]:
names := []string{"홍길동", "이순신", "강감찬"}
 
for index, name := range names {
    fmt.Println(index, name)
}


Out[2]:
0 홍길동
1 이순신
2 강감찬

if


In [ ]:
func iftest() int {
    return 100;
}

y := 120
z := 70
if x := iftest(); x < y {
    fmt.Println(x)
} else if x > z {
    fmt.Println(z)
} else {
    fmt.Println(x)
}

In [1]:
x := 100
max := 0

if x > max {
    fmt.Println(x)
}


Out[1]:
100

swich


In [1]:
swichCodition := 7
switch swichCodition {
case 0: fmt.Println("영")
case 1: fmt.Println("일")
case 2: fmt.Println("이")
case 3: fmt.Println("삼")
case 4: fmt.Println("사")
case 5: fmt.Println("오")
default: fmt.Println("알 수 없는 숫자")
}


Out[1]:
알 수 없는 숫자

배열, 슬라이스, 맵

배열

우리가 C에서 배운 배열과 동일하다. 길이가 고정되고, 인덱스로 접근 가능한 같은 타입의 원소의 나열체.


In [1]:
var array [10]int // declare


array[1] = 1004
primes := [6]int{2,3,5,7,11,13}  // assign 

x := [5]float64{
    98,
    93,
    77,
    82,
    83,
} 

fmt.Println(array[1])
fmt.Println(array)
fmt.Println(primes)
fmt.Println(x)


Out[1]:
1004
[0 1004 0 0 0 0 0 0 0 0]
[2 3 5 7 11 13]
[98 93 77 82 83]

슬라이스

슬라이스(slice)는 배열의 일부다. 배열과 다른 점은 길이를 바꿀 수 있다는 점. C++의 vector 컨테이너와 유사하다고 생각된다.


In [1]:
var x []float64  //declare
x := make([]float64, 5) //declare
x := make([]float64, 5, 10) //declare
// make([]T, length, capacity)

new_x := new([10]float64)[0:5]  //same

fmt.Println("x : ", x)
fmt.Println("x length : ", len(x))
fmt.Println("new_x : ", new_x)
fmt.Println("new_x length : ", len(new_x))


arr := []float64{1,2,3,4,5}
slice_arr1 := arr[0:3]
slice_arr2 := arr[0:]
slice_arr3 := arr[:5]

fmt.Println("slice_arr1 : ", slice_arr1)
fmt.Println("slice_arr2 : ", slice_arr2)
fmt.Println("slice_arr3 : ", slice_arr3)

// built-in function
// append(slice []Type, elems ...Type) []Type
// copy(dst, src []Type) int
// Copy returns the number of elements copied

slice_arr4 := append(slice_arr1, 10, 11)
slice_arr5 := make([]float64, 2)
copy(slice_arr5, slice_arr4)

fmt.Println("slice_arr4 : ", slice_arr4)
fmt.Println("slice_arr5 : ", slice_arr5)


Out[1]:
x :  [0 0 0 0 0]
x length :  5
new_x :  [0 0 0 0 0]
new_x length :  5
slice_arr1 :  [1 2 3]
slice_arr2 :  [1 2 3 4 5]
slice_arr3 :  [1 2 3 4 5]
slice_arr4 :  [1 2 3 10 11]
slice_arr5 :  [1 2]

맵은 순서가 없는 키-값(key-value) 집합. python의 dictionary 라고 생각됨.


In [1]:
var x map[string]int  //declare  key:string , value:int

x := make(map[string]int) //initialize
x["age"] = 30

fmt.Println("x의 age는 : ", x["age"])

value, ok := x["name"]    // 첫 반환값: 탐색결과 , 두번째 반환값: 탐색 성공여부
fmt.Println(value, ok)


elements := map[string]string{
    "H": "Hydrogen",
    "He": "Helium",
    "Li": "Lithium",
    "Be": "Beryllium",
    "B": "Boron",
    "C": "Carbon",
    "N": "Nitrogen",
    "O": "Oxygen",
    "F": "Fluorine",
    "Ne": "Neon",
}

for key, value := range elements {
    fmt.Println("eleement : " + key + " , " + value)
}


Out[1]:
x의 age는 :  30
0 false
eleement : N , Nitrogen
eleement : O , Oxygen
eleement : F , Fluorine
eleement : C , Carbon
eleement : He , Helium
eleement : Li , Lithium
eleement : Be , Beryllium
eleement : B , Boron
eleement : Ne , Neon
eleement : H , Hydrogen

In [1]:
new_elements := map[string]map[string]string{
          "H": map[string]string{
                "name":"Hydrogen",
                "state":"gas",
          },
          "He": map[string]string{
                "name":"Helium",
                "state":"gas",
          },
          "Li": map[string]string{
                "name":"Lithium",
                "state":"solid",
          },
          "Be": map[string]string{
                "name":"Beryllium",
                "state":"solid",
          },
          "B":  map[string]string{
                "name":"Boron",
                "state":"solid",
          },
          "C":  map[string]string{
                "name":"Carbon",
                "state":"solid",
          },
          "N":  map[string]string{
                "name":"Nitrogen",
                "state":"gas",
          },
          "O":  map[string]string{
                "name":"Oxygen",
                "state":"gas",
          },
          "F":  map[string]string{
                "name":"Fluorine",
                "state":"gas",
          },
          "Ne":  map[string]string{
                "name":"Neon",
                "state":"gas",
          },
    }
 
    if el, ok := new_elements["Li"]; ok {
           fmt.Println(el["name"], el["state"])
    }


Out[1]:
Lithium solid

In [ ]: