(๐ŸญGo) Syntax

ํ›Œ๋ฅญํ•œ ์–ธ์–ด๋ฅผ ์ดํ•ดํ•  ๋Šฅ๋ ฅ์€ ์—†์ง€๋งŒ(?) ์ข‹์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ Š์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•ด

6 minute read

Overview


C++ ๊ฐœ๋ฐœ์ž์ž„์—๋„ C๋ฅผ ๋ณ„๋กœ ์ข‹์•„ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ๋งŒ์„ ์œ„ํ•œ ์–ธ์–ด๋Š” ์•„๋‹ˆ์ง€๋งŒ ์—„์—ฐํžˆ C++๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ด๊ณ  C์–ธ์–ด๋Š” ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฐœ๋ฐœ์ง„ ๋ชจ๋‘๊ฐ€ C++์˜ ๋ณต์žก์„ฑ์ด ์‹ซ์–ด์„œ Go๋ฅผ ๊ฐœ๋ฐœํ–ˆ๋‹ค๊ณ  ๋ง์„ ํ–ˆ์ง€๋งŒ, ๋‚˜๋Š” Go์˜ ๋ฌธ๋ฒ•์˜ ์ƒ๊น€์ƒˆ๋„ API๋“ค์˜ ์‹œ๊ทธ๋‹ˆ์ณ๋„ ๋ณด๊ธฐ๊ฐ€ ์‹ซ๋‹ค. ๋งˆ์น˜ C์–ธ์–ด ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋Ÿผ์—๋„ Go๋Š” ๋›ฐ์–ด๋‚œ ์žฅ์ ๋“ค์ด ์žˆ์–ด ๋ฉ€๋ฆฌ ๋‘˜ ์ˆ˜๊ฐ€ ์—†๋Š”๋ฐ, ๊ทธ์ค‘ ์ œ์ผ์€ ๋งŽ์€ ํšŒ์‚ฌ๋“ค์—์„œ Golang์„ ์ฑ„์šฉํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹คใ…œ ํŠนํžˆ๋‚˜ ์ธํ”„๋ผ ๊ฐœ๋ฐœ์— ์žˆ์–ด์„œ Go๋Š” ์ข‹์€ ๋„๊ตฌ๋กœ ์—ฌ๊ฒจ์ง€๊ณ  ์žˆ๋‹ค. docker์™€ kubernates ์—ญ์‹œ golang์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ๋Š” ๋‘ ๋ฒˆ์งธ๋กœ ์–ธ๊ธ‰๋œ๊ฒŒ ์–ต์šธํ•  ์ •๋„๋กœ ์ข‹์€ ๊ธฐ๋Šฅ์ธ goroutine์ด๋‹ค.

**[๋ฏธ] MuliThreadProgramming [mสŒฬ ltiฮธred-|proสŠgrำ•mษชล‹]** : 1. ํ‘๋งˆ์ˆ , ๋งˆ๊ณต 2. ์œ„๋ ฅ์ด ๊ฐ•๋Œ€ํ•˜๋‚˜ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ค์›Œ ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š” ๊ธฐ์ˆ   

๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ง€๋‚œํ•จ์„ ๊ฒฝํ—˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” goroutine ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ go๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์ถฉ๋ถ„ํ•˜๋‹ค. goroutine์˜ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ๋ณ„๋„์˜ ํฌ์ŠคํŠธ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์†Œ๊ฐœํ•  ์˜ˆ์ •์ด๋‹ค.

์„ธ ๋ฒˆ์งธ๋Š” ๊ฐ„๊ฒฐํ•จ์ด๋‹ค. ์‚ฌ์‹ค ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ์ผ ์ˆ˜ ์žˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์„ ๋‚ด์žฅ API๋งŒ์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ์— repository์—์„œ ์—ด์‹ฌํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋ฐฐํฌํ•˜๋Š” ์ผ์ด ๋ณ„๋กœ ํ•„์š”์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡๋ณด๋‹ค ๋ฌธ๋ฒ• ๋˜ํ•œ ๊ฐ„๋‹จํ•˜๋‹ค. ์ด์˜๊ฒŒ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•˜๋Š”๊ฑธ ๋„˜์–ด์„œ ์•„์ฃผ ๋ผˆ๋งŒ ๋‚จ์€ ๋А๋‚Œ์ด๋‹ค.

์ด์™ธ์—๋„ GC๋ฅผ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ, ์ข‹์€ ์ƒํƒœ๊ณ„์™€ ๋„๊ตฌ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ๋‹ค.

Rival

์ฒ˜์Œ์—๋Š” Golang์˜ ๋ผ์ด๋ฒŒ์€ Rust๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘ ์–ธ์–ด ๋ชจ๋‘ C/C++์„ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์•Œ๋ ค์ ธ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ Golang์€ ๊ทธ๋Ÿฌํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์‚ฌ์šฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์˜คํžˆ๋ ค Python์˜ ์Šคํฌ๋ฆฝํŒ… ์šฉ๋„๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  ์žˆ๋Š”๊ฒŒ ์•„๋‹Œ๊ฐ€ ์‹ถ๋‹ค. Python์˜ ์ƒํƒœ๊ณ„๊ฐ€ ์•„์ง ํ›จ์”ฌ ์ปค๋ณด์ด์ง€๋งŒ ์„ฑ๋Šฅ์€ Go์˜ ์••์Šน์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  Rust๋Š” ์ง„์ •ํ•œ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๊ฐ€๊ณ  ์žˆ๋Š”๊ฒŒ ์•„๋‹Œ์ง€โ€ฆ(๊ฐœ์ธ์ ์œผ๋กœ ํ˜ธ๊ฐ๋„๋Š” Rust์˜ ์••์Šน์ด๋‹ค)

Syntax

Python๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•„์ฃผ ๋””ํ…Œ์ผํ•œ ๋ฌธ๋ฒ•์‚ฌํ•ญ์„ ์ •๋ฆฌํ•˜์ง€๋Š” ์•Š์„ ์ƒ๊ฐ์ด๋‹ค. ์ˆ˜๋งŽ์€ ์ž๋ฃŒ์™€ ์ฑ…์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜๋„ Python๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด์šฉ์€ ๋” ๋งŽ์„ ๊ฒƒ ๊ฐ™๋‹ค.

package์™€ main ํ•จ์ˆ˜

package main    // ์ด ํŒŒ์ผ์ด main ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค  
  
import "fmt"    // built in ํŒจํ‚ค์ง€๋ฅผ importํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค  
  
func main() {  
    fmt.Println("Hello world!")  
}   

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

์ ‘๊ทผ ์ง€์ •์ž ๊ฐœ๋…

package something  
  
import "fmt"  
  
func SayHello() {  
	fmt.Println("Hello")  
}  

๋ณ„๋„์˜ ํŒŒ์ผ์— something ํŒจํ‚ค์ง€์— ํฌํ•จ๋  ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.
์—ฌ๊ธฐ์„œ ์ ‘๊ทผ์ง€์ •์ž ๊ฐœ๋…์ด ๋‚˜์˜ค๋Š”๋ฐ,

  • sayHello => private
  • SayHello => public export

๋Œ€์†Œ๋ฌธ์ž์— ์˜ํ•ด export ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ์–ธ๋œป๋ณด๋ฉด ์ด์ƒํ•˜์ง€๋งŒ Convention rule์„ ๊ฒธํ•˜๋Š” ๋ฌธ๋ฒ•์ด๋ผ ์ข‹์€๊ฑฐ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค. ์ด๊ฒƒ์„ ์ด์šฉํ•ด์„œ ํ•˜๋‚˜์˜ package๋ฅผ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ํด๋ž˜์Šค, ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ interface๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.

Structure

type Account struct {  
	owner   string  
	Balance int			// ๋Œ€๋ฌธ์ž๋ผ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅ  
}  

Structure์—์„œ๋„ member์˜ ๊ฐ€์‹œ์„ฑ์„ ์ฒซ ๋ฌธ์ž์˜ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
์œ„ ๊ฒฝ์šฐ Balance๋งŒ ๋ฐ–์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

Implicit type determine :=

package main  
  
import "fmt"  
  
func main() {  
	name := "hoo"  
	name = "lynn"  
	fmt.Println(name)  
}  

:=๋Š” ๋ฌด์ฒ™ ์ด์ƒํ•˜๊ฒŒ ์ƒ๊ฒผ์ง€๋งŒ ์•”์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค. ์ด ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜๋ฅผ ์ถ”์ •ํ•˜์—ฌ ํƒ€์ž…์—†์ด ๋ฐ”๋กœ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์„ ์–ธ๊ฐ€๋Šฅํ•˜๊ณ  ์ „์—ญ์ ์œผ๋กœ๋Š” ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.

:=
์ด๋ ‡๊ฒŒ ๋‹จ๋…์œผ๋กœ ์จ๋ณด๋‹ˆ ์•ฝ๊ฐ„ ๊ท€์—ฌ์šด๊ฑฐ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค. ์—„์ฒญ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ๋ชจ๋ฅด๊ณ  ์ฝ”๋“œ๋ฅผ ๋ดค์„๋•Œ, ์ด๊ฑฐ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ์—„์ฒญ ์™ธ๊ณ„์–ด์ฒ˜๋Ÿผ ๋ณด์˜€์—ˆ๋‹ค.

Function

package main  
  
import (  
	"fmt"  
	"strings"  
)  
  
// ๋’ค์— ๊ด„ํ˜ธ์— ๋ฆฌํ„ดํ˜•์„ ์ง€์ •ํ•˜๊ณ  ๋ฉ€ํ‹ฐ ๋ฆฌํ„ด์ด ๊ฐ€๋Šฅํ•˜๋‹ค!  
func lenAndUpper(name string) (int, string) {  
	return len(name), strings.ToUpper(name)  
}  
  
// ...์œผ๋กœ ๊ฐ€๋ณ€ ์ธ์ž๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค  
func repeatMe(words ...string) {  
	fmt.Println(words)  
}  
  
func main() {  
	totalLenght, _ := lenAndUpper("hoo")  
	fmt.Println(totalLenght)  
}  

Multi return๊ณผ ๊ฐ€๋ณ€ ์ธ์ž๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ด๊ฑด ์ƒ๋‹นํ•œ ํฐ ํŽธ์˜๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ ๊ฐ™๋‹ค.

naked return๊ณผ defer

func lenAndUpper(name string) (length int, uppercase string) {    // ๋ฆฌํ„ด ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๋กœ ์„ ์–ธ ๊ฐ€๋Šฅ  
	defer fmt.Println("I'm done")    // ํ•จ์ˆ˜๊ฐ€ ๋๋‚œ ๋’ค ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•œ๋‹ค  
	length = len(name)  
	uppercase = strings.ToUpper(name)  
	return  
}  

๋‘ ๋ฒˆ์งธ ๊ด„ํ˜ธ์•ˆ์˜ ๋ณ€์ˆ˜๋ช… ์ง€์ •์€ naked return ์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ๋ฆฌํ„ด ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๋กœ ๊ด„ํ˜ธ์—์„œ ์ง€์ •ํ•ด์„œ ํ•จ์ˆ˜๋‚ด์—์„œ ๋”ฐ๋กœ ์„ ์–ธ์„ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ฆฌํ„ดํ•  ๋ณ€์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธํ•˜๊ณ  ๊ฐ’์„ ์ฑ„์›Œ๋„ฃ๋Š” ํŒจํ„ด์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์„ํ…๋ฐ ๊ทธ๋Ÿด๋•Œ ์œ ์šฉํ•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  defer ํ‚ค์›Œ๋“œ๋Š” ๋’ค์— ์žˆ๋Š” ๋ฌธ์žฅ์„ ํ•จ์ˆ˜๊ฐ€ ๋๋‚œ๋’ค์— ์‹คํ–‰ํ•˜๋„๋ก ํ•ด์ค€๋‹ค. Post process๋ฅผ ์ •์˜ํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๋‹ค.

๋ฐ˜๋ณต๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ

// ๋ฐ˜๋ณต๋ฌธ์€ ์˜ค์ง for๋ฌธ ๋ฟ์ด๋‹ค  
total := 0  
for index, number := range numbers {	// index๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๋•Œ๋Š” _, number ์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉ  
	total += number  
}  
  
if koreanAge := age + 2; koreanAge < 18 {  
	return false  
}  

Variable expression

switch koreanAge := age + 2; koreanAge {  
	case 10:  
		return false  
	case 18:  
		return true  
    case koreanAge > 18:  
        return true;  
}  

modern c++์—์„œ๋„ ์ถ”๊ฐ€๋˜์—ˆ๋˜ ์‚ฌํ•ญ์ด๋‹ค. ๋‚ด์šฉ์ฒ˜๋Ÿผ if๋ฌธ ์•ˆ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค. if ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋” ์ˆจ๊ธธ ์ˆ˜ ์žˆ์–ด ์ข‹๋‹ค. switch์—์„œ๋„ variable expression์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , case์—์„œ ์กฐ๊ฑด๋„ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ if~else๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

Pointer

func main() {  
	fmt.Println(canIDrink(18))  
	a := 2  
	b := &a  
	*b = 2020;  
	fmt.Println(a, *b)  
}  

๊ฐœ๋…๊ณผ ์—ฐ์‚ฐ์ž ๋“ฑ ๋ชจ๋‘ C์–ธ์–ด์—์„œ์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ๋™์ผํ•˜๋‹ค.

Array์™€ Slice

import "fmt"  
  
func main() {  
	names := [5]string{"hoo", "lynn", "dal"}   // ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋ฉด Array  
  
	names := []string{"hoo", "lynn", "dal"}    // ํฌ๊ธฐ๋ฅผ ๋น„์›Œ๋‘๋ฉด Slice  
	names = append(names, "flynn")  
	fmt.Println(names)  
}  

Golang์˜ ํƒœ์ƒ์„ ๊ณ ๋ คํ• ๋•Œ, c์–ธ์–ด์— ์ต์ˆ™ํ•˜๋ฉด ์•„์ฃผ ๊ฐœ๋…์ด ์ž˜ ๋‹ฌ๋ผ๋ถ™๋Š”๋‹ค. Array๋Š” ํฌ๊ธฐ๊ฐ€ ๋ถˆ๋ณ€์ธ C์–ธ์–ด์˜ Array์™€ ๋™์ผํ•˜๋ฉฐ, Slice๋Š” append ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด STL์˜ vector์ฒ˜๋Ÿผ ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒโ€ฆappend์˜ ์‚ฌ์šฉ๋ฒ•์€ ์ „ํ˜€ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

Map

import "fmt"  
  
func main() {  
	hoo := map[string]int{"name": 3, "age": 7}  
    value, exist := hoo["name"]  
	for key, value := range hoo {  
		fmt.Println(key, value)  
	}  
}  
  
func (d Dictionary) Delete(word string) {  
	delete(d, word)  
}  

์—๋Ÿฌ์ฒ˜๋ฆฌ

func (a *Account) Withdraw(amount int) error {  
	if a.balance < amount {  
		return errNoMoney  
	}  
	a.balance -= amount  
	return nil  
}  

golang์—๋Š” try/catch์™€ ๊ฐ™์€ ๋ฌธ๋ฒ•์ด ์—†๋‹ค. if ๋ฌธ์„ ํ†ตํ•ด ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋Š” ์œ„์™€ ๊ฐ™์ด ํ•œ๋‹ค.
์—๋Ÿฌ๊ฐ€ ์•„๋‹ ๋•Œ nil์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์ฃผ๋ชฉํ•œ๋‹ค.

toString

func (a Account) String() string {  
	return fmt.Sprint(a.Owner(), "โ€™s account.\nHas: ", a.Balance())  
}  

structure์— ์œ„์™€ ๊ฐ™์ด ์ •์˜ํ•˜๋ฉด ์ž๋ฐ”์˜ toString()์ฒ˜๋Ÿผ ํ˜ธ์ถœ๋œ๋‹ค.

type

package mydict  
  
import "errors"  
  
// Dictionary type  
type Dictionary map[string]string  
  
var errNotFound = errors.New("Not Found")  
  
// Search for a word  
func (d Dictionary) Search(word string) (string, error) {  
	value, exists := d[word]  
	if exists {  
		return value, nil  
	}  
	return "", errNotFound  
}  

type์€ C์–ธ์–ด์˜ typedef์™€ ๊ฐ™์€ ๊ฐœ๋…์ธ๋ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
์–ด๋–ค ๊ฒƒ์ด๋“  ํƒ€์ž…์œผ๋กœ ์–ด๋– ํ•œ ์ด๋ฆ„์„ ์ง“๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค์ค‘ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”

// ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๋ฅผ ์ด๋ ‡๊ฒŒ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค  
var (  
	errNotFound   = errors.New("Not Found")  
	errCantUpdate = errors.New("Cant update non-existing word")  
	errWordExists = errors.New("That word already exists")  
)  
  
// ํŒŒ๋ผ๋ฉ”ํ„ฐ์˜ ๋ณ€์ˆ˜๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ ํ•œ๋ฒˆ๋งŒ ์ž‘์„ฑํ•ด๋„ ๋œ๋‹ค  
func (a, b int) Balance() int {  
	return a.balance  
}  

Example

์€ํ–‰ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋„๋ก ํ•˜์ž.

import "fmt"  
  
type person struct {  
	name    string  
	age     int  
	favFood []string  
}  
  
func main() {  
	favFood := []string{"kimchi", "ramen"}  
	hoo := person{name: "hoo", age: 18, favFood: favFood}  
	fmt.Println(hoo.name)  
}  
  
package accounts  
  
// Account struct  
type Account struct {  
	owner   string  
	balance int  
}  
  
// NewAccount creates Account  
func NewAccount(owner string) *Account {  
	account := Account{owner: owner, balance: 0}  
	return &account  
}  

Golang์—๋Š” ์ƒ์„ฑ์ž ๊ฐœ๋…์ด ์—†๊ธฐ๋•Œ๋ฌธ์— ์œ„ NewAccount์—์„œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค. ์œ„ structure์—์„œ owner, balance๋Š” ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์—†๋‹ค. ๋Œ€์‹  ๊ฐ™์€ package๋‚ด์˜ NewAccount์—์„œ ์ƒ์„ฑํ•˜๊ณ  ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ์ฐธ์กฐ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.

account := accounts.NewAccount("hoo")
์ด๋Ÿฐ ์‹์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค. accounts๋Š” ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด๋‹ค.

// Deposit x amount on your account  
func (a Account) Deposit(amount int) {    // ์•ž์— ๊ด„ํ˜ธ๋Š” Receiver๋ผ๋Š” ๋…€์„์ด๋‹ค  
	a.balance += amount  
}  
  
// Balance of your account  
func (a Account) Balance() int {  
	return a.balance  
}  

structure์— ๋Œ€ํ•œ method๋„ ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ถฉ๋ถ„ํžˆ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ตœ์†Œํ•œ C์–ธ์–ด์™€ ๊ฐ™์€ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋Š” ํ”ผํ•˜๊ณ ๋„ ๋‚จ๋Š”๋‹ค. ์ƒ์†์ด ์—†์–ด๋„ ์บก์Аํ™”, ์ •๋ณด์€๋‹‰ ๊ทธ๋ฆฌ๊ณ  ๋• ํƒ€์ดํ•‘(Duck typing)์„ ์ด์šฉํ•œ ๋‹คํ˜•์„ฑ ์ •๋„๋Š” ๊ฐ€๋Šฅํ• ๊ฑฐ ๊ฐ™๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด Deposit์€ ์ž˜์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
C์–ธ์–ด ๊ธฐ์ดˆ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•Œ์ˆ˜์žˆ๋‹ค. a๋Š” ๋ณต์‚ฌ๋ณธ์ด๋‹ค.

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

C์–ธ์–ด๋ฅผ ์•ˆ๋‹ค๋ฉด ์ต์ˆ™ํ•  ๊ฒƒ์ด๋‹ค. ์ € ๋งค๊ฐœ๋ณ€์ˆ˜์˜ *๋Š” ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํฌ์ธํ„ฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋ณ„๊ฒƒ๋„ ์•„๋‹Œ๋ฐ ๊ทธ๋ ‡๊ฒŒ ์‚ฌ๋žŒ๋“ค์„ ๊ดด๋กญํžŒ๋‹ค๋Š” Call by pointer. ๊ทธ๋ฆฌ๊ณ  Balance์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์ž˜ ๋™์ž‘ํ• ๊ฒƒ์ด๋‹ค.