Go 기본 문법

오병민·2021년 6월 13일
0

go

목록 보기
3/7
post-thumbnail

1. Imports and Exports

VSCode를 사용하면 자동으로 사용하려는 패키지가 imports 될 것이다.
hello world 예제에서 fmt 패키지의 Println 함수를 작성 할 때 자동으로 import 되는 것을 확인 할 수 있다.

Go에서 export 는 함수이름이나 변수이름 첫 글자를 대문자로 쓰면 export 하겠다는 소리다.
정말 간단하다.

실제로 fmt 패키지에서 사용 할 수 있는 함수 목록을 보면 모두 첫글자가 대문자인걸 확인 할 수 있다.

2. 변수와 상수

기본

// 변수
var [변수명] [타입] = "값"
ex) var name string = "이름"

// 상수
const [변수명] [타입] = "값"
ex const NAME string = "name"

변수 타입

int, string, float, bool 이 기본적으로 있고

나머지는 go types 여기를 참고 바란다.

축약형

Go 에는 변수를 선언 할 때 축약형이 존재 한다.
주의해야 할 점은 함수 안에서만 사용 할 수 있다. 전역에서는 사용 못한다.

[변수명] := [값]

으로 사용 하면 컴파일러가 값의 타입을 추론해 자동으로 타입을 할당해 준다.

// 전역 공간

food := "rice"  안됨(X)
var food string = "rice" 이것만 가능

func main(){
    food := "rice" // food 변수에 string 타입 할당
    num := 1       // num 변수에 int 타입 할당
}

3. 함수

함수는 func 키워드를 사용하면 된다.

func [함수명](arguments) return type {
	...
}

func add(a int, b int) int {
	return a + b
}

OR

func add(a, b int) int {
	return a + b
}

여러개의 리턴 값을 가질 수 있다.

func add(a int, b int) (int, string) {
	return a+b, "Add success"
}

func main(){
    // value 에는 3이 result 에는 "Add success" 가 받아진다
    value, result := add(1, 2)
    
    // _ 를 사용해서 무시 할 수 있다.
    value, _ := add(1,2)
}

argument 를 여러개 받을 수 있다.

func repeatMe(words ...string){
    fmt.Println(words)
}

func main(){
    repeatMe("a", "b", "c", "d")
}

// [a b c d]

naked return

func lenAndUpper(name string) (length int, uppercase string){
    length = len(name)
    uppercase = strings.ToUpper(name)
    return
}

defer : 함수가 끝나고 뭔가를 더 실행시켜준다

func lenAndUpper(name string) (length int, uppercase string){
    defer fmt.Println("done")
    length = len(name)
    uppercase = strings.ToUpper(name)
    return
}

4. for, range, ...args

Go 에는 오직 for 만 있다.

func superAdd(numbers ...int) int {
    // range 는 array에 loop를 적용할 수 있도록 해준다.
    // 기본적으로 index 를 준다.
    total := 0
    for index, number := range numbers {
        total += number
    }
    return total
}

func main() {
    total := superAdd(1,2,3,4,5,6)
}

5. if with a Twist

func canIDrink(age int) bool {
    // 조건에 () 가 필요없다.
    if age < 18 {
        return false
    }
    return true
}

variable experssion : if를 쓰는 순간에 variable 을 생성 할 수 있다.

func canIDrink(age int) bool {
    if koreanAge := age + 2; koreanAge < 18 {
        return false
    }
    return true
}

6. switch

break point 가 필요 없다.

func canIDrink(age int) bool {
    switch age {
        case 10:
            return false
        case 18:
            return true
    }
    return true
}

7. Pointers

C 와 비슷

& 주소값

* 주소로 접근

func main(){
    a := 2
    b := &a
    *b = 6
    fmt.Println(a)
    // 6 출력
}

8. Arrays and Slices

array 는 크기를 가지고 있음

slice 는 크기를 동적으로 할당 가능

numbers := [5]int{1,2,3,4}
numbers[4] = 5

// Slice : length 없이 Array 사용
// append 는 직접 값을 수정 하는 것이 아니라 새로운 값을 return 해준다.
numbers := []int{1,2,3,4}
numbers = append(numbers, 5)

9. Maps

map[key]value{...}

map 도 iterator 하게 사용 할 수 있다.

me := map[string]string{"name":"byeongmin", "age":"29"}
// print : map[age:29, name:byeongmin]

for key, value := range me {
    fmt.Println(key, value)
}
// print : name byeongmin
//         age 29

10. Structs

type person struct {
    name string
    age int
    favFood []string
}

func main(){
    // 1. 순서대로 값을 넣어줌
    favFood := []string{"a", "b"}
    me := person{"obm", 29, favFood}

    // 2. key 값을 지정하여 작성
    me := person{name: "obm", age: 29, favFood: favFood}
}
profile
안녕하세요

0개의 댓글