똑같은 삽질은 2번 하지 말자
Golang vol.1 (Getting Start, := = 차이, 함수) 본문
개요
고랭 학습하면서 느낀점이나 기록하면 좋을법한 내용들을 정리
프로젝트 시작하기
이하의 사이트에서 OS에 따라 설치를 진행해준다.
설치가 끝나면 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' 카테고리의 다른 글
Golang vol.5 (0) | 2022.05.05 |
---|---|
Golang vol.3 (0) | 2022.04.25 |