๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Go & Rust

[Go] Golang ๊ธฐ๋ณธ ์†Œ๊ฐœ(ํƒ€์ž…, ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๋ฌธ๋ฒ•)

by ์„œ์•„๋ž‘๐Ÿ˜ 2023. 4. 16.

 

 

โœ… ํƒ€์ž…

go์–ธ์–ด๋Š” ์–ธ์–ด์ฐจ์›์˜ ํ‚ค์›Œ๋“œ๊ฐ€ 25๊ฐœ๋ฐ–์— ์—†๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋น„๊ตํ•˜๋ฉด ํ™•์‹คํžˆ ์ ์€ ๊ฒƒ์„ ์•Œ ์ˆ˜์žˆ๋‹ค.
 
 
์ž๋ฃŒํ˜•์€ ์ •์ˆ˜(int, uint), ์‹ค์ˆ˜(float), ๋ฌธ์ž/๋ฌธ์ž์—ด(string), ๋ถˆ๋ฆฌ์–ธ(bool), ๋ฐ”์ดํŠธ(byte), rune(int32์™€ ๊ฐ™์Œ), complex(64, 32)๊ฐ€ ์žˆ๋‹ค.
 
 
 

โœ… ๋ณ€์ˆ˜

๋ณ€์ˆ˜ ์„ ์–ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 
var x int = 10
var arr [5]int  // ๋ฐฐ์—ด
var p *int      // ํฌ์ธํ„ฐ
const C int = 10  // ์ƒ์ˆ˜ ์„ ์–ธ
 
๋ณ€์ˆ˜ x๋Š” intํ˜•์ด๋‹ค ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ž.
 
 
 
๐Ÿงจ ์ž๋ฃŒํ˜• ์ถ”๋ก 
 
var i = 10
var p = &i
 
 
i := 10
p := &i
 
๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฃŒ๋ฅผ ์ถ”๋ก ํ•œ๋‹ค. var๋ผ๋Š” ํ‚ค์›Œ๋“œ ์—ญ์‹œ :=์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.
 
 

๐Ÿงจ ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ

C ์–ธ์–ด์˜ sizeof ์—ฐ์‚ฐ์ž์ฒ˜๋Ÿผ ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด unsafe ํŒจํ‚ค์ง€์˜ Sizeof ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ํฌ๊ธฐ๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„.
package main
 
import "fmt"
import "unsafe" // Sizeof ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ unsafe ํŒจํ‚ค์ง€ ์‚ฌ์šฉ
 
func main() {
var num1 int8 = 1
var num2 int16 = 1
var num3 int32 = 1
var num4 int64 = 1
 
fmt.Println(unsafe.Sizeof(num1)) // 1
fmt.Println(unsafe.Sizeof(num2)) // 2
fmt.Println(unsafe.Sizeof(num3)) // 4
fmt.Println(unsafe.Sizeof(num4)) // 8
}
 
 
 
 
 

โœ… ํ•จ์ˆ˜์™€ ๋ฐ˜๋ณต๋ฌธ

 
func(int, int)
func(int) int
func(int, func(int, int)) func(int) int
 
3๋ฒˆ์งธ ํ•จ์ˆ˜ ์„ค๋ช…: ์ •์ˆ˜ ๊ทธ๋ฆฌ๊ณ  ๋‘ ์ •์ˆ˜๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ›๊ณ , ์ ์ˆ˜ ํ•˜๋‚˜๋ฅผ ๋ฐ›๊ณ  ์ •์ˆ˜ํ•˜๋‚˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
 
ํŒฉํ† ๋ฆฌ์–ผ์„ ๊ตฌํ˜„ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณด์ž.
 
// Package main implements factorial.
package main
 
import "fmt"
 
// fac returns n!.
func fac(n int) int {
    if n <= 0 {
        return 1
    }
    return n * fac(n-1)
}
 
// facItr returns n!.
func facItr(n int) int {
    result := 1
    for n > 0 {
        result *= n
        n--
    }
    return result
}
 
func main() {
    fmt.Println(fac(5))
    fmt.Println(facItr(5))
}
 
fac์€ ์žฌ๊ท€๋ฅผ ํ†ตํ•œ ๊ตฌํ˜„์ด๊ณ , facItr๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•œ ๊ตฌํ˜„์ด๋‹ค. go์—์„œ์˜ ๋ฐ˜๋ณต๋ฌธ์€ for๋ฐ–์— ์—†๊ณ  while์€ ์กด์žฌ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— while๋ฌธ๊ณผ ๋น„์Šทํ•œ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.
 
 
์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” for๋ฌธ์œผ๋กœ ์ž‘์„ฑํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
func facItr2(n int) int {
    result := 1
    for i := 1; i <= n; i++ {
        result *= i
    }
    return result
}
 
 
 
๋‹ค์Œ์€ range for๋ฌธ์ด๋‹ค.
  
names := []string{"ํ™๊ธธ๋™", "์ด์ˆœ์‹ ", "๊ฐ•๊ฐ์ฐฌ"}
 
for index, name := range names {
    println(index, name)
}
  
for range๋ฌธ์€ for ์ธ๋ฑ์Šค, ์š”์†Œ๊ฐ’ := range ์ปฌ๋ ‰์…˜ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ปฌ๋ ‰์…˜์—์„œ ํ•˜๋‚˜์”ฉ ์š”์†Œ๋ฅผ ๋ฆฌํ„ดํ•ด์„œ ๊ทธ ์š”์†Œ์˜ ์œ„์น˜์ธ๋ฑ์Šค์™€ ๊ฐ’์„ index, name 2๊ฐœ์˜ ๋ณ€์ˆ˜์— ๊ฐ๊ฐ ํ• ๋‹นํ•œ๋‹ค.
 
 
๋ฐ˜๋ณต๋ฌธ์„ ์ •๋ฆฌํ•˜๋ฉด ์ผ๋ฐ˜ for๋ฌธ, ์กฐ๊ฑด์‹ for๋ฌธ(while), range for๋ฌธ 3๊ฐ€์ง€๋‹ค.
 
 
 

โœ… switch ์ดˆ๊ธฐ๋ฌธ

 
package main
 
import "fmt"
 
func getMyAge() int {
    return 22
}
 
func main() {
    switch age := getMyAge(); age { // getMyAge() ๊ฒฐ๊ณผ๊ฐ’ ๋น„๊ต โถ
    case 10:
        fmt.Println("Teenage")
    case 33:
        fmt.Println("Pair 3")
    default:
        fmt.Println("My age is", age) // age๊ฐ’ ์‚ฌ์šฉ
    }
 
    fmt.Println("age is", age) // error - age ๋ณ€์ˆ˜๋Š” ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. โท
}
 
 
switch๋ฌธ์—์„œ age๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  switch๋ฌธ์˜ ๋น„๊ต๊ฐ’์œผ๋กœ age๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.
 
package main
 
import "fmt"
 
func getMyAge() int {
    return 22
}
 
func main() {
    // age ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”
    switch age := getMyAge(); true { // โถ
    case age < 10:
        fmt.Println("Child")
    case age < 20:
        fmt.Println("Teenager")
    case age < 30:
        fmt.Println("20s")
    default:
        fmt.Println("My age is", age) // age๊ฐ’ ์‚ฌ์šฉ
    }
}
 
age ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐ๋ฌธ์„ ํ†ตํ•ด์„œ ์„ ์–ธ ๋ฐ ๋Œ€์ž…ํ•˜๊ณ  switch์˜ ๋น„๊ต‘๊ฐ’์œผ๋กœ true๋ฅผ ์‚ฌ์šฉํ•ด์„œ case ์กฐ๊ฑด๋ฌธ์ด true๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ๋Š”๋‹ค. ์—ฌ๊ธฐ์„œ ๋น„๊ต๊ฐ’์ด true์ผ ๊ฒฝ์šฐ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— switch age := getMyAge(); { ๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
 
 

โœ… switch: fallthrough ์‚ฌ์šฉํ•˜๊ธฐ

ํŠน์ • case์˜ ๋ฌธ์žฅ์„ ์‹คํ–‰ํ•œ ๋’ค ๋‹ค์Œ case์˜ ๋ฌธ์žฅ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” fallthrough ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋งˆ์น˜ C, C++์˜ switch ๋ถ„๊ธฐ๋ฌธ์—์„œ break ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค. ๋‹จ, ๋งจ ๋งˆ์ง€๋ง‰ case์—๋Š” fallthrough ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
 
i := 3
 
switch i { // ๊ฐ’์„ ํŒ๋‹จํ•  ๋ณ€์ˆ˜ ์„ค์ •c
ase 4: // ๊ฐ ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š”
fmt.Println("4 ์ด์ƒ") // ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
fallthrough
case 3: // 3๊ณผ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜๋ฏ€๋กœ
fmt.Println("3 ์ด์ƒ") // ์ด ๋ถ€๋ถ„์„ ์‹คํ–‰
fallthrough // fallthrough๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ ์•„๋ž˜ case๋ฅผ ๋ชจ๋‘ ์‹คํ–‰
case 2:
fmt.Println("2 ์ด์ƒ") // ์‹คํ–‰
fallthrough
ase 1:
fmt.Println("1 ์ด์ƒ") // ์‹คํ–‰
fallthrough
case 0:
fmt.Println("0 ์ด์ƒ") // ์‹คํ–‰, ๋งˆ์ง€๋ง‰ case์—๋Š” fallthrough๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
}
 
์‹คํ–‰ ๊ฒฐ๊ณผ
 
3 ์ด์ƒ
2 ์ด์ƒ
1 ์ด์ƒ
0 ์ด์ƒ
3์€ case 3:์—์„œ “3 ์ด์ƒ”์„ ์ถœ๋ ฅํ•˜๊ณ  fallthrough ํ‚ค์›Œ๋“œ๋กœ ๋‹ค์Œ case์˜ ๋ฌธ์žฅ์„ ๊ณ„์† ์‹คํ–‰ํ•˜์—ฌ “2 ์ด์ƒ”, “1 ์ด์ƒ”, “0 ์ด์ƒ”์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
 
 

โœ… switch: ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ๊ฐ™์€ ๋ฌธ์žฅ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” case์—์„œ , (์ฝค๋งˆ)๋กœ ๊ฐ’์„ ๊ตฌ๋ถ„ํ•ด์ค๋‹ˆ๋‹ค.
  • case ๊ฐ’1, ๊ฐ’2, ๊ฐ’3:
i := 3
 
switch i {
case 2, 4, 6: // i๊ฐ€ 2, 4, 6์ผ ๋•Œ
fmt.Println("์ง์ˆ˜")
case 1, 3, 5: // i๊ฐ€ 1, 3, 5์ผ ๋•Œ
fmt.Println("ํ™€์ˆ˜")
}
 
์‹คํ–‰ ๊ฒฐ๊ณผ
 
ํ™€์ˆ˜
 

 

๋Œ“๊ธ€