스터디📖/Go

쉽고 빠른 Go 시작하기 - #1 THEORY

호프 2022. 3. 25. 22:52

https://nomadcoders.co/go-for-beginners/lobby

 

쉽고 빠른 Go 시작하기 – 노마드 코더 Nomad Coders

Go for Beginners

nomadcoders.co

해당 강의를 들으면서 GO 스터디를 학기 중에 진행하게되었다.

바빠 죽겠지만.. 시작..

이전 게시글에서 환경설정하는 부분은 끝마쳤고 이제 본격적으로 프로그래밍에 들어간다.


1.0 Main Package

main 이 entry point라서 컴파일러는 패키지 이름이 main인 것부터 찾아내서 컴파일함
GO에서는 package name을 작성해주어야 함.
func main() -> Go 프로그램의 시작점.
main package의 main function에서 시작.
main.go 패키지 작성 -> 컴파일 됨.

실행 하려면 go run main.go

// main.go
package main

import "fmt"

func main() { // things only to compile
    fmt.Println("Hello world!")
}

1.1 Packages and Imports

fmt는 Go 가 가지고 있는 package -> vscode에서는 자동으로 import가 생성되고삭제됨.

대문자로 시작하는 function은 export function.. 소문자로 시작하는 function은 private이라 다른 패키지에서 접근안됨.

package something

import "fmt"

func sayBye() {
    fmt.Println("Bye")
}

func SayHello() {
    fmt.Println("Hello")
}

1.2 Variables and Constants

package main

func main() {
    const name sring = "jiyong" // 상수 -> 거의 사용하지 않음
    var name2 string = "gd"
    name2 := "gd" // Go가 type을 알아서 찾아줌. function안에서만 작동하는 축약형표현
}

1.3 Functions part One

func multiply(a int, b int) int { // (a, b int) 도 가능
    return a * b
}

func main() {
    fmt.Println(multiply(2, 2))
}

function can return multiple value

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

func main() {
    totalLength, upperName := lenAndUpper("jiyong")
    // totalLength, _ := lenAndUpper("jiyong") // _ 는 ignore value
}

go 에서 variable을 만들고 사용하지 않으면 error 발생

unlimited arguments를 받는 방법

func repeatMe(words ...string) {
}

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

1.4 Functions part Two

naked return

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

defer
function이 끝났을 때 실행되는 코드

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

1.5 for, range, ...args

loop 은 오직 for 를 사용해야함.

func superAdd(numbers ...int) int {
    total := 0
    for index, number := range numbers { // java의 for-Each 같은 기능..
        fmt.Println(index, number)
        total += number
    }

    // for i := 0; i < len(numbers); i++ {
    //     fmt.Println(numbers[i])
    // }
    return total
}

1.6 If with a Twist

func calIDrink(age int) bool {
    if koreanAge := age + 2; koreanAge < 18 { // variable expression
        return false
    } else {
        return true
    }
}

1.7 Switch

func calIDrink(age int) bool {
    switch koreanAge := age + 2; koreanAge {
    case 10:
        return false
    case 18:
        return true
    }
    return false
}

1.8 Pointers!

& : memory a ddress

  • : value of the memory address
    b를 이용해서 a의 값 업데이트
    func main() {
    a := 2
    b := &a
    *b = 20
    fmt.Println(a) // 20
    }

1.9 Arrays and Slices

array 만들 때 길이와 타입을 명시해줘야 함
길이 제한 없이 쓰고 싶을 때는 Slice 사용

func main() {
    names := [5]string {"a", "b", "c"}
    names[3] = "d"
    names[4] = "e"

    names2 = []string{"a", "b", "c"}
    names2 = append(names2, "d") // slice에 원소 추가할 때는 append 함수 사용
    // names2를 modify 하지 않고 새로운 슬라이스를 리턴함
}

1.10 Maps

func main() {
    nico := map[string]string{"name":"nico", "age":"23"} // key-value

    for key, value := range nico {
        fmt.Println(key, value)
    }
}

1.11 Structs

struct

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

func main() {
    favFood := []string{"sushi", "ramen"}
    nico := person{name: "nico", age: 18, favFood: favFood} // nico := person("nico", 18, favFood}
}

Go doesn't have a constructor method