Golang

솔다·2023년 1월 24일
0

go의 syntax 정리

For

go는 모든 loop를 for 하나로 한다.

for에서는 C에서의 문법과 동일하게 사용하는 방법이 있고, range를 사용하는 방법이 있다. 아래의 코드에 간단한 예시로 덧셈을 나타냈다.

package main

import "fmt"

func superAdd(numbers ...int) int {
	total := 0
	// for index, number := range numbers {
	// 	total += number
	// }
	for i := 0; i < len(numbers); i++ {
		total += numbers[i]
	}
	return total
}

func main() {
	var total int
	total = superAdd(1, 2, 3, 4, 5, 6)
	fmt.Println(total)
}

주석처리되어 있는 부분이 for문에서 range를 활용하는 방법이다. range를 활용하면, index와 실제 value를 같이 리턴받을 수 있다. for문을 활용해서 쉽게 하는 방법이 있는 것.

package main

import "fmt"

func superAdd(numbers ...int) int {
	total := 0
	for _, number := range numbers {
	total += number
	}
	return total
}

func main() {
	var total int
	total = superAdd(1, 2, 3, 4, 5, 6)
	fmt.Println(total)
}

그 외에도 몇가지 문법을 추가하면, _를 쓰게 되면 해당 variable을 그냥 무시하겠다는 뜻으로 쓰인다. 즉, range를 활용해서 return 받은 index를 그냥 사용하지 않겠다고 선언한 것이다.

If 문

Go에서는 If 문 내부에 variable 선언이 가능하다.

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

위의 함수에서 보면, python처럼 콜론(:)을 붙여주거나 할 필요가 없다. 그냥 바로 조건을 쓰고 {} 만 열어주면 바로 사용이 가능하다. 그리고 if내부에서 variable을 만들어줄 수 있다. 이렇게 작성하면 다른사람들이 이 코드를 봤을 때, 해당 if 문 용으로 사용하기 위한 변수를 선언해줬음을 알기 쉬워진다.

Switch 문

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

C에서 썼던 것처럼 무분별한 if, else if 구문을 생략할 수 있게 해주는 문법. 값을 비교하는 것으로 파악한다. If에서 해줬던 것처럼, 내부에서 변수를 선언해주고 이용할 수 있다.

Array & Slice

Array는 length를 명시, Slice는 unlimited size의 Array

Array를 쓰고 싶으면 []를 쓰면 된다. 대신 그 안에 길이를 명시해주고, type을 써야한다.

func main() {
	//Array
	names := [5]string{"nico", "lynn", "sol"}
    //Slice
    sliceNames := []string{"nico", "lynn", "sol"}
    sliceNames = append(sliceNames, "flynn")
    fmt.Println(names, slicenames)
}

map

파이썬의 object 같은 녀석이다.
key와 value가 존재한다. 각각의 type을 지정해주어야 한다.

package main

import "fmt"

func main(){
	sol := map[string]string{"name" : "nico", "age": "12"}
    for key, value := range nico{}
    fmt.Printls(key,value)
}

map에서는 위의 코드와 같이 range를 사용할 수도 있다.

Private & Public

private과 public을 구분하는 이유는, 패키지 외부와 내부를 구분해서 사용하기 위함이다. private을 해놓는 이유는 패키지 내부에서만 호출되도록 하기 위함이다.
Private과 Public을 구분하는 방법은 앞의 시작 문자를 uppercase로 쓰는 것이다. 이런 간단한 방법을 통해 구분할 수 있다.

reciever

receiver는 아래의 함수처럼 작성된다.

func (a Account) Deposit(amount int) {
	a.balance += amount
}

이렇게 func 과 함수 이름의 사이에 ()와 함께 작성해주는데, 양식이 있다. 무조건 해당 구조체의 가장 앞 문자의 소문자로 써주는게 정식이다.

근데 이렇게 작성한 함수를 아래와 같은 main.go에서 실행시키려고 하면 문제가 발생하는데,

func main() {
	account := banking.NewAccount("solda")
	account.Deposit(100)
	fmt.Println(account.Balance())
}

실제로는 가장 기본값인 0이 출력된다.(NewAccount에서는 값을 설정해주지 않았다.)

이런 문제는 바로 Go가 작동하는 방식 때문에 그렇다. 이런 방식으로 작성하게 되면 Go는 이 구조체의 복사본을 만들어서 작동하게 된다.

이를 해결하기 위한 방법이 pointer reciever이다.

func (a *Account) Deposit(amount int) {
	a.balance += amount
}

C에서 처럼 * 를 달아주는 걸로 포인터 reciever를 만들면 해결된다.
이는 Go 에게 복사본을 만들지 말고, 실제 object의 값을 수정하도록 명령하는 것과 같다.

Error

함수에서 error 상황이 발생할 수 있다. Go에서는 자동으로 error를 처리해주지 않기 때문에, 우리는 일일이 error들을 체크해주어야 한다.

0개의 댓글