
fmt ์ถ๋ ฅ์ด๋ ๊ฐ๋จํ ๋ณ์์ ์ธ์ ์ด๊ธฐ์ธํ ๋ ํด๋ดค์ผ๋๊น ๋์ด๊ฐ๊ณ , ๋ค๋ฅธ ๊ธฐ์ด๋ฌธ๋ฒ๋ถํฐ ์ ๋ฆฌํ๊ฒ ๋ค. ๋ณ์ ์ ์ธ์์ ์ถ๊ฐ๋ก ๊ธฐ์ตํ ๋งํ๊ฑด destructuring๋ ์ค์ ์ ๋๋ค.
var d, e, f int = 40, 50, 60 g, h, i := 70, 80, 90 x, y := 1, 2 x, y = y, x // ์ด๊ฒ ๋๋ค...
# ํจ์ func - ๋จ์ผ ๊ฐ ๋ฐํ, ๋ค์ค ๊ฐ ๋ฐํ, ๋ฐํ ๋ณ์๋ช ๋ช ์
go์ ํจ์๋ฅผ ๋ณด๋ฉด์ ์ฌ๋ฐ๋ค๊ณ ๋๋๊ฑด ๋ฆฌํด๊ฐ์ ์ฌ๋ฌ๊ฐ ์ค ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐํ๊ฐ์ ์ด๋ฆ์ ๋ถ์ฌ์ ๋ค๋ฃจ๋ ๋ถ๋ถ๋ ํน์ดํ๋ค.
package main import "fmt" func add(x int, y int) int { return x + y } func plusMinus(x int, y int) (int, int) { return x + y, x - y } func namedPlusMinus(x int, y int) (p int, m int) { p = x + y // ํจ์ ์ ์ธ ๋ ๋ช
์ํด๋ ๋ณ์๋ฅผ ๊ฐ๊ณ ์์ ์ธ ์ ์๋ค m = x - y return // ๋ช
์์ ๋ฐํ๊ฐ ์์ด ๋ฐํ } func main() { result := add(1, 1) plus, minus := plusMinus(1, 1) fmt.Println(result) // 2 fmt.Println(plus) // 2 fmt.Println(minus) // 0 }
# ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ if, switch, for
golang์์ ์กฐ๊ฑด์ ๋ถ์ผ ๋๋ ๊ดํธ๋ก ๋ฌถ์ง ์๋๋ค. ๊ดํธ๊ฐ ์์ผ๋ ์์ผ๋ ์๊ด์์ด์ผ๋ ๊ฒ ๊ฐ์๋ฐ ๊ดํธ๊ฐ ์์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ด๋ฟ๋๋ค. vscode์์ goํ๋ฌ๊ทธ์ธ์ ๋ฌ์๋๋ ์์์ ๊ดํธ๋ฅผ ๋นผ๋ฒ๋ฆฌ๋ ๊ฒ๋ ๋ณผ ์ ์๋ค.
package main import "fmt" func main() { x := 10 if (x > 5) { fmt.Println("x๋ 5๋ณด๋ค ํฝ๋๋ค.") } if x > 5 { // ์ด๊ฒ ๋ง์ fmt.Println("x๋ 5๋ณด๋ค ํฝ๋๋ค.") } }
else if๋ else๋ ๋์ผํ๊ฒ ์ฌ์ฉํ๋ค.
if๋ฌธ์์ ๋ณ์์ ์ธ๋ ๊ฐ๋ฅํ๋ฐ, ์ฌ๊ธฐ์ ์ ์ธํ ๋ณ์๋ if๋ฌธ ์ค์ฝํ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
if x := 10; x > 5 { fmt.Println("x๋ 5๋ณด๋ค ํฝ๋๋ค.") } fmt.Println(x) // x์ ์ ๊ทผํ ์ ์๋ค.
๊ฐ๊ฒฐํจ์ ์งํฅํ๋ ์ธ์ด๋ต๊ฒ ๋ญ๊ฐ ๋ง์ด ์๋ค.
switch~case
x := 2 switch x { case 1: fmt.Println("One") case 2: fmt.Println("Two") case 3: fmt.Println("Three") default: fmt.Println("Other") }
if~else if ~ else ๋ ๋์ผํ ๊ฐ๋ ์ด๋ค. ๊ธฐ์กด switch case๋ ๋ค๋ฅธ ์ ์ด๋ผ๋ฉด break๊ฐ ์์ด๋ ๋ฐ์ผ๋ก ์ญ ๋ด๋ ค๊ฐ์ง ์๋๋ค. ์กฐ๊ฑด์ ๋ฃ์ด์ ์ฌ์ฉํ ์๋ ์์ด์ ์ฝํ๋ฆฐ์ when๊ณผ ๋ ์ ์ฌํ๋ค๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
age := 25 switch { case age < 18: fmt.Println("Child") case age >= 18 && age < 30: fmt.Println("Young Adult") case age >= 30 && age < 60: fmt.Println("Adult") default: fmt.Println("Senior") }
์ญ ํ๊ณ ๋ด๋ ค๊ฐ๊ฒ ํ๊ณ ์ถ์ผ๋ฉด fallthrough ํค์๋๋ฅผ ์ ์ธํ๋ฉด ๋๋ค.
x := 1 switch x { case 1: fmt.Println("One") fallthrough case 2: fmt.Println("Two") default: fmt.Println("Other") }
์ด ์ฝ๋๋ One, Two๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฐ๋ณต๋ฌธ์์๋ while์ด ์๊ณ for๋ก ๋ค์ํ ๊ตฌ๋ฌธ์ ์์ฑํ ์ ์๋ค.
for i := 1; i <= 5; i++ { // ์ด๊ธฐ๊ฐ; ์กฐ๊ฑด; ์ฆ๊ฐ fmt.Println(i) // 1๋ถํฐ 5๊น์ง ์ถ๋ ฅ }
์ด๊ฒ ๊ธฐ๋ณธ for๋ฌธ์ด๋ค. while์ฒ๋ผ ์ฌ์ฉํ๋ ค๋ฉด ์กฐ๊ฑด๋ง ์๋ for๋ฅผ ์ฐ๋ฉด ๋๋ค.
i := 0 for i < 5 { fmt.Println(i) i++ }
๋ฌดํ๋ฃจํ๋ฅผ ์ํ๋ค๋ฉด??? ์กฐ๊ฑด ๋ง์ ์์ ๊ณ , break ์กฐ๊ฑด์ ๋ฃ์ด๋๋ฉด ๋๋ค.
i := 0 for { fmt.Println(i) i++ if i >= 5 { break } }
# ๋ฐฐ์ด
var arr [3]int // ์ ์ํ ๋ฐฐ์ด ์ ์ธ, ๊ธธ์ด 3 // arr := [3]int{1, 2, 3} // ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ ํด์ผ๋๋๊น {} ์ด๊ฑธ๋ก ๋ฌถ์ด์ ํด์ค๋ค // arr := [...]int{1, 2, 3} // ๋ฐฐ์ด๊ธธ์ด๊ณ์ฐ์ ์ปดํ์ผ๋ฌ์๊ฒ ๋๊ธฐ๋ ๋ฐฉ๋ฒ๋ ๊ฐ๋ฅํ๋ค arr[0] = 1 arr[1] = 2 arr[2] = 3 fmt.Println(arr) // [1 2 3] ์ถ๋ ฅ
๋ฐฐ์ด ๋ถํฐ๋ ํผ์ ์ด ์๊ธฐ๊ธฐ ์์ํ๋ค. ์๋ฐ์ ๊ฒฝ์ฐ int[] arr ์ด๋ฐ ์์ผ๋ก ์ฐ๊ณ , c๋ฉด int arr[] ์ด๋ ๊ฒ ์ผ๊ธฐ ๋๋ฌธ์ด๋ค. ๋คํํ ์ ์ธ๋ง ๋ค๋ฅด๊ณ ๋๋จธ์ง๋ ๋น์ทํด์ ์ ์๋๊ณ ์๋ค.
for๋ฌธ๊ณผ ๋ฐฐ์ด์ ์ด์ฉํด ์ํ๋๋๊ฒ๋ ๊ฐ๋ฅํ๋ฐ range๋ฅผ ์ฌ์ฉํ๋ค.
for index, value := range arr { fmt.Printf("index: %d, value: %d\n", index, value) }
# ๊ตฌ์กฐ์ฒด
์ด ๋ถ๋ถ์ ์๋ฐ๋ก class ๋ง๋ค๋ค ์์ ๊ทธ๋ฐ์ง ๊ทธ๋๋ง ์ฝ๊ฒ ์ดํดํ๋ค.
type Node struct { v int w int } p := Node{v: 1, w: 30}
์ ์ธํ๋ ๊ฒ ์ข ๋ค๋ฅด๊ธดํ๋ฐ ๋ณด๊ณ ์ดํด ๋ชปํ ์ ๋๋ ์๋๋ค. ๊ทผ๋ฐ golang์ ๊ธฐ๋ณธ์ ์ผ๋ก call by value์ด๊ธฐ ๋๋ฌธ์, ์๋ฐ์ฒ๋ผ ์๋ณธ์ ์ฐธ์กฐ๊ฐ ํ์ํ๋ค๋ฉด ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ...๋ฅผ ์จ์ผ๋๋ค.
p := &Node{v: 3, w: 25}
๊ทธ๋ฅ ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ๋ new๋ก ์์ฑํ ์ ์๋ค.
p2 := new(Node) // ๊ฐ์ด ๋น์ด์๋ ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ p2.v = 7 p2.w = 77
๊ตฌ์กฐ์ฒด ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๋๋ ์ผ๋ฐ ํฌ์ธํฐ ๊ฐ์ ์ฌ์ฉํ ๋ ์ฒ๋ผ *๋ฅผ ์๋ถ์ฌ๋ ๋๋ค.
func (p *Node) zero() { // ๋ฐํํ์
์๋ค p.v = 0 }
*๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ผ๋ฉด ํฌ์ธํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ๊ฑฐ๋ผ์ ์ด ํจ์์ ์คํ์ ํจ์ ์ค์ฝํ ๋ฐ๊นฅ์ ์ํฅ์ ๋ฏธ์น๋ค. ๊ทธ๋ฅ ํจ์๋ ์กฐ๊ธ ๋ค๋ฅธ๋ฐ, Node ๊ตฌ์กฐ์ฒด์ ๋ํ ํจ์๋ฅผ ์ ์ํ๊ณ ์๋ค.
# ์ธํฐํ์ด์ค
์ธํฐํ์ด์ค๋ ๊ตฌ์กฐ์ฒด์ ๊ฑฐ์ ์ ์ฌํ๊ฒ ์๊ฒผ๋ค.
type Describer interface { Describe() string } type Person struct { Name string Age int }
interface๋ผ๊ณ ์ง์ ํด์ ์ฌ์ฉํ๋ค. ์ ์ฝ๋ ์์ผ๋ก๋ Describe ํจ์๋ฅผ ๊ตฌํํด์ผ๋๋ Describer ์ธํฐํ์ด์ค๋ค.
// Person ๊ตฌ์กฐ์ฒด๊ฐ Describer ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ func (p Person) Describe() string { return fmt.Sprintf("Name: %s, Age: %d", p.Name, p.Age) } func main() { var d Describer p := Person{Name: "Alice", Age: 30} d = p fmt.Println(d.Describe()) // "Name: Alice, Age: 30" }
Person ๊ตฌ์กฐ์ฒด๊ฐ Describe ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ d = p๋ก ํ ๋นํ ์ ์๋ค.
๋ค์ค ์์๊ณผ ๊ฐ์ ๊ฐ๋ ๋ ๊ฐ๋ฅํ๋ค.
type Describer interface { Describe() string } type Worker interface { Work() } type Person struct { Name string Age int } func (p Person) Describe() string { return fmt.Sprintf("Name: %s, Age: %d", p.Name, p.Age) } func (p Person) Work() { fmt.Printf("%s is working.\n", p.Name) } func main() { var d Describer var w Worker p := Person{Name: "Alice", Age: 30} d = p w = p fmt.Println(d.Describe()) // "Name: Alice, Age: 30" w.Work() // "Alice is working." }
๋น ์ธํฐํ์ด์ค๋ฅผ ๋งค๊ฐ๋ณ์ ํ์ ์ผ๋ก ์ ์ธํด์ ์ ๋ค๋ฆญ์ฒ๋ผ ์ธ ์๋ ์๋ค.
func foo(i interface{}) { fmt.Printf("Type: %T, Value: %v\n", i, i) }
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์!
'์ฝ์งโ๏ธ > Goโ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Go ์ด๊ธฐ์ธํ - fmt, reflect, ๋ณ์ ์ ์ธํ๊ธฐ (0) | 2024.05.30 |
---|