똑같은 삽질은 2번 하지 말자

Golang vol.1 (Getting Start, := = 차이, 함수) 본문

Go

Golang vol.1 (Getting Start, := = 차이, 함수)

곽빵 2022. 4. 17. 17:40

개요

고랭 학습하면서 느낀점이나 기록하면 좋을법한 내용들을 정리

프로젝트 시작하기 

이하의 사이트에서 OS에 따라 설치를 진행해준다.

https://go.dev/dl/

 

Downloads - The Go Programming Language

Downloads After downloading a binary release suitable for your system, please follow the installation instructions. If you are building from source, follow the source installation instructions. See the release history for more information about Go releases

go.dev

설치가 끝나면 mac의 경우에는 (local)user/go 라는 디렉터리가 생기고 그 안에 go get을 이용한 패키지를 설치할 때 이 go라는 디렉터리 안에 저장되며 각각의 프로젝트에서 설치한 go패키지들을 어떻게 이 user/go를 바라볼 수 있게 하는지는 GOPATH라는 환경변수를 이용해서 바라보게 한다.

 

만들고 싶은 프로젝트 디렉터리에서 아래의 명령어를 치면 go.mod라는 파일이 생성되는데 여기에는 go의 버전과 이 프로젝트에서 사용하고 있는 package들이 적혀있다. (이 이름이 나중에 루트디렉터리 같은 역할도 한다.)

go mod init 이름

그리고 main.go를 만들어 보자

package main

import "fmt"

func main() {
	fmt.Println("Hellow World")
}
go run main.go

:= 와 = 의 차이?

:= 선언, 양도 및 재선언을위한 것이고, 변수의 유형도 자동으로 추론한다.

예를 들어, foo := 74과 밑의 나열들과 똑같은 의미이다. (참고로 함수내에서만 := 을 사용할 수 있다.)

// 1 
var foo int
foo = 74

// 2
var foo int = 74

// 3
var foo = 74

// 1,2,3은 이하의 코드로 대체할 수 있다.
foo := 74

주의할 점은 :=을 이용해 이미 존재하던 변수에 재선언을 하는 경우 variables scope를 주의해야한다.

이전에 if else로 분기처리로 로직을 구성하고 if 안에 어떤 변수에 := 을 썼기 때문에 변수를 재선언을 한것이 됬는데

그 재선언한 값으로 들어간 친구를 if 밖에서도 불러내려고 할 때 값이 계속 비어있어서 뭐지? 라고 삽질을 좀 했었다.

func CreateOrUpdateCart(c *fiber.Ctx) error {
	var cart models.Cart
	var request CreateOrUpdateOrderRequest

	if err := c.BodyParser(&request); err != nil {
		return err
	}

	db.DB.Where("title = ?", request.Title).Find(&cart)

	if cart.Id == 0 {
		// create
		cart := models.Cart{
			Title:       request.Title,
			Description: request.Description,
			Price:       uint(request.Price),
			Amount:      uint(request.Amount),
		}
		db.DB.Model(&cart).Create(&cart)
	} else {
		// update
		cart.Amount = cart.Amount + uint(request.Amount)
		db.DB.Model(&cart).Updates(&cart)
	}
	fmt.Printf("%s", cart.Title) // create의 cart는 빈값으로 출력
	return c.JSON(cart)
}

함수의 이름을 PascalCase camelCase로 했을 때의 차이

Go 언어에서는 함수의 이름에 따라 해당 함수의 가시성이 달라진다

  • 파스칼 케이스 (PascalCase): 함수의 이름이 대문자로 시작하는 경우 (예: MyFunction), 해당 함수는 공개 (public) 함수가 된다. 이는 다른 패키지에서도 이 함수를 호출할 수 있음을 의미
  • 카멜 케이스 (camelCase): 함수의 이름이 소문자로 시작하는 경우 (: myFunction), 해당 함수는 비공개 (private) 함수가 되며 이는 해당 함수가 선언된 패키지 내에서만 호출될  있음을 의미 

함수는 복수의 값을 리턴할 수 있다.

이 특징이 다른 언어와 꽤 차이를 보이는데 이하의 코드를 보면 lenAndUpper라는 값은 두개의 값을 동시에 리턴한다.

Go에서는 이런식으로도 코딩이 가능하다.

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

func main() {
	leng, upperStr := lenAndUpper("heewon")
	fmt.Println(leng, upperStr)
}

함수는 가변하는 인자를 받을 수 있다.

가변인자는 인자의 갯수가 보통 함수는 정해져 있는데 그에 관계없이 한개 또는 복수의 인자를 보내도 함수를 사용할 수 있다

func variableArgs(str ...string) {
	fmt.Println(str)
}

func main() {
	variableArgs("gwak", "hee", "won") // output: [gwak hee won]
	variableArgs("gwakheewon") // output: [gwakheewon]
}

함수의 실행이 끝났을 때 어떤 동작을 예약할 수 있는 예약어 defer 

func variableArgs(str ...string) {
	defer fmt.Println("is done!")
	fmt.Println(str)
}

func main() {
	variableArgs("gwak", "hee", "won")
	variableArgs("gwakheewon")
}

출력결과

* 포인터와 & 래퍼런스를 쓴다(C언어 추억)

내용작성중...

VSCode에서 Go의 자동완성 및 자동줄맞춤을 위해서는 아래를 참조

https://code.visualstudio.com/docs/languages/go

 

Go with Visual Studio Code

Learn about Visual Studio Code editor features (code completion, debugging, snippets, linting) for Go.

code.visualstudio.com

 

'Go' 카테고리의 다른 글

Golang vol.5  (0) 2022.05.05
Golang vol.3  (0) 2022.04.25
Comments