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 |
---|