05
30

golang์— ํฅ๋ฏธ๊ฐ€ ์ƒ๊ฒจ์„œ ์ž…๋ฌธํ–ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์ตœ์‹ ํ™” ๋œ ์ž๋ฃŒ๊ฐ€ ๋„ˆ๋ฌด ์—†๋‹ค... ์˜๋ฌธ์ด๋ฉด ๋งŽ์€๋ฐ ํ•œ๊ตญ์–ด๋กœ ๋œ ์ž๋ฃŒ๊ฐ€ ๋งŽ์ด ์—†์–ด์„œ ์•„์‰ฝ๋‹ค.

 

์„ค์น˜๋Š” ๊ทธ๋ƒฅ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๊ฐ€์„œ msi, pkg๋ฅผ ๋ฐ›์•„ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

https://go.dev/dl/

 

All releases - The Go Programming Language

 

go.dev

์„ค์น˜๋ฅผ ํ•˜๊ณ ๋‚˜์„œ cmd๋‚˜ terminal์— go version์„ ์‹คํ–‰ํ•˜๋ฉด ์ž˜ ๋‚˜์˜ค๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ ์œ ํŠœ๋ธŒ ๊ฐ•์˜๋ฅผ ๋ณด๋ฉด์„œ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ ค๋Š”๋ฐ ํ™ˆ๋””๋ ‰ํ† ๋ฆฌ์— go ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์—†๋‹ค!

๋ถ„๋ช… go env๋ฅผ ์ณ์„œ ํ™˜๊ฒฝ์„ค์ •์— gopath๊ฐ€ ์žˆ๋Š” ๊ฑธ ๋ดค๋Š”๋ฐ, ์‹ค์ œ๋กœ ๊ฐ€๋ณด๋ฉด gopath๊ฐ€ ์—†๋‹ค. ๊ฐ•์˜๋ฅผ ๋”ฐ๋ผํ•˜๋‹ค ๋ณด๋ฉด ๊ฐ•์˜์—๋Š” go ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ๊ณ  src, pkg, bin ํด๋”๊ฐ€ ์žˆ์„๊ฑด๋ฐ 1.11 ๋ฒ„์ „ ์ดํ›„๋กœ๋Š” ๋ชจ๋“ˆ์‹œ์Šคํ…œ์œผ๋กœ ์ „ํ™˜๋˜์–ด์„œ ์ „์—ญํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์„ ๋”ฐ๋กœ ํ•ด์ค„ํ•„์š”๊ฐ€ ์—†์–ด์กŒ๋‹ค.(์„ค์น˜ํ•  ๋•Œ ์ •ํ•ด์ง„ default ๊ฐ’ ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ๋œ๋‹ค.)

 

# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •ํ•˜๊ธฐ

mkdir workspace-go
cd workspace-go

๋จผ์ € ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. 

go mod init workspace-go

๊ทธ ๋‹ค์Œ go mod init "ํ”„๋กœ์ ํŠธ์ด๋ฆ„" ์œผ๋กœ ๋ชจ๋“ˆ์„ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค. ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์œผ๋กœ ํ•ด๋„ ๋˜๊ณ , ํŒจํ‚ค์ง€ ๋ช…์œผ๋กœ ํ•ด๋„ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ฐ•์˜ ์˜ˆ์ œ๋“ค์„ ๋ณด๋ฉด ๋ณดํ†ต ํŒจํ‚ค์ง€ ๋ช…์œผ๋กœ ํ•˜๋Š” ๊ฒƒ๊ฐ™๋‹ค...

module workspace-go

go 1.22.3

์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ณ ๋‚˜๋ฉด go.mod ํŒŒ์ผ์ด ์ƒ๊ธฐ๋Š”๋ฐ, ์—ด์–ด๋ณด๋ฉด go ์–ธ์–ด ๋ฒ„์ „์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ require๋กœ ์ข…์†์„ฑ ๊ด€๋ฆฌ๋„ ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ๋Š” ์ด ๋ชจ๋“ˆ์— ์„ ์–ธ๋œ ์ข…์†์„ฑ์„ ๋”ฐ๋ฅด๊ฒŒ ๋˜๊ณ  ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ ์ด์ „ ํ•œ ์ด์œ ๊ฐ€ ์ด๊ฒƒ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

 

๋ชจ๋“ˆ์„ ์ข€ ๋” ์•Œ๋ณด๊ธฐ ์œ„ํ•ด Gin์„ ๋ฐ›์•„๋ณด์ž. Gin์€ ์›น์•ฑ ๋งŒ๋“œ๋Š”๋ฐ ์“ฐ์ด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.

go get github.com/gin-gonic/gin

์ด๊ฑธ ํ•˜๊ณ  go.modํŒŒ์ผ์„ ๋‹ค์‹œ ์—ด์–ด๋ณด๋ฉด ์ข…์†์„ฑ๋“ค์ด ์ฃผ๋ฅด๋ฅต ๋‹ฌ๋ ค์žˆ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

module workspace-go

go 1.22.3

require (
	github.com/bytedance/sonic v1.11.6 // indirect
	github.com/bytedance/sonic/loader v0.1.1 // indirect
	github.com/cloudwego/base64x v0.1.4 // indirect
	github.com/cloudwego/iasm v0.2.0 // indirect
	github.com/gabriel-vasile/mimetype v1.4.3 // indirect
	github.com/gin-contrib/sse v0.1.0 // indirect
	github.com/gin-gonic/gin v1.10.0 // indirect
	github.com/go-playground/locales v0.14.1 // indirect
	github.com/go-playground/universal-translator v0.18.1 // indirect
	github.com/go-playground/validator/v10 v10.20.0 // indirect
	github.com/goccy/go-json v0.10.2 // indirect
	github.com/json-iterator/go v1.1.12 // indirect
	github.com/klauspost/cpuid/v2 v2.2.7 // indirect
	github.com/leodido/go-urn v1.4.0 // indirect
	github.com/mattn/go-isatty v0.0.20 // indirect
	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
	github.com/modern-go/reflect2 v1.0.2 // indirect
	github.com/pelletier/go-toml/v2 v2.2.2 // indirect
	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
	github.com/ugorji/go/codec v1.2.12 // indirect
	golang.org/x/arch v0.8.0 // indirect
	golang.org/x/crypto v0.23.0 // indirect
	golang.org/x/net v0.25.0 // indirect
	golang.org/x/sys v0.20.0 // indirect
	golang.org/x/text v0.15.0 // indirect
	google.golang.org/protobuf v1.34.1 // indirect
	gopkg.in/yaml.v3 v3.0.1 // indirect
)

vendor๋ผ๋Š” ๊ฒƒ๋„ ์žˆ์–ด์„œ ๋ฐฐํฌ๊ฐ™์€ ํ™˜๊ฒฝ์˜ ์ข…์†์„ฑ๊ด€๋ฆฌ์— ํ•„์š”ํ•˜๋‹ค๋Š”๋ฐ ์ด๊ฑด ๋‚˜์ค‘์— ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค. 

์ด๊ฑธ ์ญ‰ ํ•ด๋ณด๋‹ˆ IDE๋กœ new projectํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜์ž‘์—…์œผ๋กœ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

# ํŒŒ์ผ ๋งŒ๋“ค๊ณ  ์‹คํ–‰ํ•˜๊ธฐ

package main

import "fmt"

func main() {
    fmt.Println("์•ˆ๋…•ํ•˜์„ธ์š”")
    fmt.Printf("์•ˆ๋…•ํ•˜์„ธ์š” %s", "์•ˆ๋…•ํžˆ๊ฐ€์„ธ์š”")
}

Go๋Š” ํŒจํ‚ค์ง€๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

mainํŒจํ‚ค์ง€๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•ด ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฉฐ mainํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š”๋‹ค. mainํ•จ์ˆ˜๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธ์‹ํ•˜๋Š” ์ง„์ž…์ ์ด๋ผ๊ณ  ์ƒ๊ฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” import๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์“ธ๋•Œ๋Š” ๊ด„ํ˜ธ์•ˆ์— ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ง€๊ธˆ์€ fmtํ•˜๋‚˜๋ผ ๊ด„ํ˜ธ๊ฐ€ ํ•„์š”์—†๋‹ค.

fmt๋Š” C ๊ณ„์—ด๋กœ ์ƒ๊ฐํ•˜๋ฉด stdio.h ์ •๋„๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. scanf, printf ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๊ทธ๊ฒƒ์ด๋‹ค.

 

์ด์ œ ์˜ˆ์‹œ๊ฐ™์€ ๊ฑธ ๋”ฐ๋ผํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ ์„ค์ •์ด ๋๋‚ฌ๋‹ค.

 

์ด๋ฆฌ ์ €๋ฆฌ ๋‘˜๋Ÿฌ๋ณด๋‹ค๊ฐ€ ์‹ฌ์ƒ์น˜์•Š์€ ๊ฑธ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. Go๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ call by value๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ’์„ ๋„˜๊ธฐ๊ณ  ๋‚˜๋ฉด ๋…๋ฆฝ๋œ ์กด์žฌ๋กœ ๋„˜๊ฒจ์ค€ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€ํ•ด๋„ ์›๋ณธ์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๋Š”๊ฑธ ์˜๋ฏธํ•˜๋Š”๋ฐ Go๋Š” C์˜ ํŠน์ง•์„ ๊ฐ–๋Š” ์–ธ์–ด๋‹ต๊ฒŒ "ํฌ์ธํ„ฐ"๋ฅผ ๊ฐ–๊ณ ์žˆ๋‹ค. ํฌ์ธํ„ฐ๋ฅผ ์“ฐ๋ฉด call by reference๊ฐ€ ๋˜๋Š”๋ฐ ์•„๋งˆ C๋ฅผ ์•ˆํ•ด๋ณธ ์‚ฌ๋žŒ์ด๊ฑฐ๋‚˜ ์ฐธ์กฐ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์•ฝํ•œ์‚ฌ๋žŒ์€ ํ—ท๊ฐˆ๋ฆด ๋ถ€๋ถ„์ด๋‹ค. Go๋Š” GC๋„ ๊ฐ–๊ณ  ์žˆ๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋„ ๋‚ด๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ดํ•œ ์–ธ์–ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

var a int = 10
var p *int = &a

์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜ a์˜ ์ฃผ์†Œ๋ฅผ ์ •์ˆ˜ํ˜• ํฌ์ธํ„ฐ p์— ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ๋Š” ์ฝ”๋“œ๋‹ค. ๋ณ€์ˆ˜ ์„ ์–ธํ•  ๋•Œ  a:=10 ์ด๋Ÿฐ์‹์œผ๋กœ ๊ทธ๋ƒฅ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ๋™์ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ํƒ€์ž…์„ ๋ช…์‹œํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ, ๋‚˜๋Š” ๋ญ”๊ฐ€ ๋ช…์‹œ์ ์ธ ํƒ€์ž…์„ ์–ธ์ด ์ข‹์•„์„œ ์ด๋ ‡๊ฒŒ ์“ด๋‹ค. ๋˜ :=๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฌด์กฐ๊ฑด ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค. var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ผ๋‹จ ์„ ์–ธ์€ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”์—†๊ณ  ์„ ์–ธํ•ด๋‘๋ฉด ํ•ด๋‹น ํƒ€์ž…์˜ zero๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ๋‹ค.

package main

import (
	"fmt"
)

func main() {
	var a string
	var b *float64
	var c int64

	fmt.Println("[", a, "]", "[", b, "]", "[", c, "]")
}
[ ] [ <nil> ] [ 0 ]

ํฌ์ธํ„ฐ์— ์ฐธ์กฐ๋ฅผ ์•ˆ๋‹ฌ์•„์คฌ๋”๋‹ˆ nil์ด ๋‚˜์™”๋‹ค...์ด๊ฑด ๋˜ ๋ญ˜๊นŒ

๋‹ค์‹œ ํฌ์ธํ„ฐ๋กœ ๋Œ์•„์™€์„œ,

package main

import "fmt"

func main() {
    var a int = 10
    var p *int = &a
    fmt.Printf("P์˜ ์ฃผ์†Œ๋Š” %p์ด๊ณ  P๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’์€ %d์ž…๋‹ˆ๋‹ค", p, *p)
}
P์˜ ์ฃผ์†Œ๋Š” 0xc00000a0b8์ด๊ณ  P๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’์€ 10์ž…๋‹ˆ๋‹ค

Cํ• ๋•Œ ๊ธฐ์–ต์ด ์ƒˆ๋ก์ƒˆ๋ก๋‚œ๋‹ค.. ๋ณ€์ˆ˜ํƒ€์ž…์„ ๋ณด๋ ค๋ฉด reflect๋ฅผ importํ•ด์„œ ์“ฐ๋ฉด๋œ๋‹ค.

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a int = 10
    var p *int = &a	

    fmt.Println("๋ณ€์ˆ˜ p์˜ ํƒ€์ž…:", reflect.TypeOf(p))
}
๋ณ€์ˆ˜ p์˜ ํƒ€์ž…: *int

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT