robert-min / project-go

Go 언어 리뷰와 기존에 파이썬으로 진행했던 프로젝트를 Go 언어로 개선한 repo
0 stars 0 forks source link

go 문법 정리 #1

Open robert-min opened 1 year ago

robert-min commented 1 year ago

목차

  1. Method - Receiver
  2. Package
  3. Interface
  4. for문
  5. array vs slice
robert-min commented 1 year ago

Method - Receiver

Value Receiver

type Home struct {
    Address string
}

func (h Home) getAddress() {
    fmt.Fprintf(h.Address)
}

func main() {
    myhome := Home{"Seoul Gangnam"}
    myhome.getAddress()
}
// output : Seoul Gangnam

Pointer Reciever

func (h *Home) getAddress() { fmt.Fprintf(h.Address) }

func (h *Home) fixAddress() { h.Adress = "Gyeongido" }

func main() { myhome := Home{"Seoul Gangnam"} myhome.fixAddress() myhome.getAddress() }

// output :Gyeongido

robert-min commented 1 year ago

Package

Package 외부 공개

별칭 Package

// 코드 작성 시 위에 별칭패키지명으로 작업


### 빈칸 지시자 [이슈](https://stackoverflow.com/questions/21220077/what-does-an-underscore-in-front-of-an-import-statement-mean)
- Go lang에서는 패키지를 변수로 선언 시 무조건 사용해야 함.
- 패키지를 직접 사용은 하지 않지만 import를 통해 `init()` 함수를 실행시켜 패키지를 초기화해야 하는 경우에 빈칸 지시자를 사용
- 패키지를 import를 하게될 경우 기본적으로 `init()`함수를 호출하게 되는 데 init 함수만 호출하고 그 외의 기능은 사용하지 않을 때 패키지 앞에 `_` 빈칸지시자를 사용함.
```go
import (
    "database/sql"
    _ "github.com/mattn/go-sqlite3"
)
robert-min commented 1 year ago

Interface

robert-min commented 1 year ago

for 문

for 변수; 조건; 연산

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println(i)
    }
}

for 조건

package main

import "fmt"

func main() {
    var i int = 1
    for i < 10 {
        i *= 2
        fmt.Println(i)
    }
}

for 무한루프

import "fmt"

func main() { for { fmt.Println("Infinite loop") } }


### for range
- for range 문은 컬렉션으로 부터 한 요소(element)씩 가져와 차례로 for 블럭의 문장들을 실행
- for 인덱스,요소값 := range 컬렉션
```go
package main

import "fmt"

func main() {
    names := []string{"a", "b", "c"}

    for idx, name := range names {
        fmt.Println(idx, name)
    }
}

break, continue, goto 문

END: println("End") }

- 아래와 같은 형식으로 작성 가능
```go
package main

func main() {
    i := 0

L1:
    for {

        if i == 0 {
            break L1
        }
    }

    println("OK")
}
robert-min commented 1 year ago

Array(배열) vs Slice(슬라이스)

배열 선언

슬라이스 선언

사이즈를 지정하면 배열로 선언되지만, 사이즈를 지정하지 않으면 슬라이스로 선언

참고

package main

import (
    "fmt"
)

func testArray(array [5]int) {
    fmt.Printf("in testArray() func %p\n", &array)
}

func testSlice(slice []int) []int {
    fmt.Printf("in testSlice() func %p\n", slice)
    return append(slice, 6)
}

func main() {
    array := [5]int{1, 2, 3, 4, 5}
    fmt.Printf("origin ptr: %p\n", &array)
    testArray(array)

    // 배열을 슬라이스로 변환, 메모리 주소는 현재까지 동일함
    slice := array[:]
    fmt.Printf("%v, %p\n", slice, slice)

    // 슬라이스에 새로운 데이터를 넣었을 때 메모리 값 변함
    slice2 := testSlice(slice)
    // 메모리가 변함. 새로 할당
    fmt.Printf("%v, %p\n", slice2, slice2)

    // 이후부터는 같음
    slice2 = append(slice2, 7)
    fmt.Printf("%v, %p\n", slice2, slice2)

}
# output
origin ptr: 0xc000100000
in testArray() func 0xc000100030
[1 2 3 4 5], 0xc000100000
in testSlice() func 0xc000100000
[1 2 3 4 5 6], 0xc00001a050
[1 2 3 4 5 6 7], 0xc00001a050