[Go] Ellipsis μ νμ©κ³Ό μ£Όμμ¬ν
Go μμ ...
μ Ellipsis (μ€μν) μ°μ°μλΌκ³ λΆλ₯Έλ€. JS μμλ μ΄λ° λ¬Έλ²μ΄ μλ κ±Έλ‘ κΈ°μ΅νλ€.
Ellipsis μ°μ°μμ μ£Όμ μ©λλ λκ°μ§ μΈλ° 1) κ°λ³μΈμ 맀κ°λ³μ
, 2) μ¬λΌμ΄μ€ νμ₯
μ λλ‘ μ μν μ μλ€.
1. κ°λ³μΈμ (Variadic Parameters)
κ°λ³ μΈμλ ν¨μκ° μμμ κ°μμ μΈμλ₯Ό λ°μ μ μκ² νλ κΈ°λ₯μ΄λ€. μλ₯Ό λ€μ΄ int ν μΈμλ₯Ό νλΌλ―Έν°λ‘ λκ²¨μΌ ν λ νκ°λ₯Ό λκΈ°κ±°λ, κ·Έ μ΄μμ μλ₯Ό λκ²¨μΌ νλ κ²½μ°λ₯Ό μκ°ν΄λ³΄μ. μΈμμ μκ° λ³νλ κ²½μ°, λ³΄ν΅ λ°°μ΄μ μΈμλ‘ λ°μμΌ νλ€κ³ μκ°ν μ μμ§λ§ ellipsis λ₯Ό μ¬μ©νλ©΄ νλΌλ―Έν°μ νμ μ κ΅³μ΄ λ°°μ΄λ‘ λ³κ²½ν νμκ° μλ€.
μλ μμλ₯Ό μ΄ν΄λ³΄μ. sum() ν¨μλ μΈμλ‘ int ν ellipsis λ₯Ό λ°μ μ μλ€.
// ν¨μ μ μ μ
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
// ν¨μ νΈμΆ
sum(1, 2, 3)
sum(1, 2, 3, 4, 5)
μ μμλ₯Ό λ³΄κ³ λ μ© ν μ μλ€. κ·Έλ₯ λ°°μ΄μ λκΈ°λ©΄ λλ κ² μλκ°? κ΅³μ΄ ellipsis λ₯Ό μΈμμ μ μΈν΄μΌνλ? κ·Έλ° μκ°μ΄ λ€μλ€λ©΄ μλ μ½λλ₯Ό 보μ. μ°¨μ΄κ° λκ»΄μ§μ€λκ° λͺ¨λ₯΄κ² λ€. κ°λ³ μΈμλ₯Ό μ¬μ©ν sum() ν¨μλ κ΅³μ΄ λ°°μ΄μ μ¬μ©νμ§ μκ³ μ§μ ν¨μ νΈμΆμ΄ κ°λ₯νμ§λ§, λ°°μ΄ μ¬λΌμ΄μ€λ₯Ό μΈμλ‘ λ°λ sumArray() λ μ¬λΌμ΄μ€λ₯Ό λͺ μμ μΌλ‘ μμ±ν΄μ€μΌ νλ€.
// κ°λ³ μΈμ μ¬μ©
func sum(numbers ...int) int {
...
}
// μ§μ νΈμΆμ΄ κ°νΈνλ€
sum(1, 2, 3)
// λ°°μ΄/μ¬λΌμ΄μ€ μ¬μ©
func sumArray(numbers []int) int {
...
}
// νΈμΆ μ μ¬λΌμ΄μ€λ₯Ό λͺ
μμ μΌλ‘ μμ±ν΄μΌ νλ€
sumArray([]int{1, 2, 3})
λ λ€λ₯Έ μμλ₯Ό μ΄ν΄λ³΄μ. λ€μ μμλ λ¬Έμλ₯Ό concatenate νλ ν¨μλ‘, elemetns μΈμλ κ°λ³μ μΌλ‘ string νμ μ λ³μλ₯Ό λ£μ μ μλ€. concatenate νκ³ μΆμ string μ΄ λͺκ°μ΄λ μκ΄μμ΄ μΈμλ₯Ό μΆκ°ν μ μλ€.
// λ¬Έμμ΄ κ²°ν© ν¨μ
func concatenate(delimeter string, elements ...string) string {
return strings.Join(elements, delimeter)
}
result := concatenate("-", "Go", "is", "awesome")
fmt.Println(result) // μΆλ ₯: Go-is-awesome
concatenate("-", "Go", "is", "awesome", "μμ", "μΆκ°", "κ°λ₯")
2. μ¬λΌμ΄μ€ νμ₯
λ€μμ μ¬λΌμ΄μ€ νμ₯ μμλ ellipsis λ₯Ό μ μ©νκ² νμ©ν μ μλ€.
μ΄μ 1λ² μμμμλ type μμ ...
μ΄ λΆμμ§λ§, μ¬λΌμ΄μ€λ₯Ό νμ₯νλ(μ½κ² λ§ν΄ λ°°μ΄μ λ²κ²¨λ²λ¦¬λ) κ²½μ°μ ...
λ₯Ό λ³μ λ€μ λΆμ΄λ©΄ λμ΄λ€.
nums := []int{1, 2, 3}
otherNums := []int{4, 5, 6}
// μ¬λΌμ΄μ€λ₯Ό κ°λ³ μμλ‘ νμ₯νμ¬ μ λ¬
allNums := append(nums, otherNums...)
// ellipsisλ₯Ό μ¬μ©νμ§ μλλ€λ©΄ μλμ²λΌ κ° μΈμλ₯Ό μνν΄μΌ νλ€.
allNums := nums
for _, num := range otherNums {
allNums = append(allNums, num)
}
// ellipsis λ₯Ό μ¬μ©ν κ² λ³΄λ¨ κ°λ
μ±μ΄ μ’μ§μλ€.
3. μ€μ μμ
μ΄λ² κΈμ μ°κ² λ μ΄μ λ₯Ό μ½λλ‘ μ€λͺ ν΄λ³΄λ € νλ€.
κΈ°μ‘΄μλ νλμ redis μλν¬μΈνΈλ₯Ό μ¬μ©νλ μμ€ν μμ, replica μλν¬μΈνΈλ₯Ό μΆκ°νκ² λλ©΄μ μ΄ 2κ°μ endpoint λ₯Ό μ°κ² λλ€. Redis μ€μ κ°μ μ΄κΈ°ν ν λ μ΄ endpoint κ°μ μ£Όμ μ ellipsis λ₯Ό μ¬μ©ν μ μμλ€. κΈ°μ‘΄ μ½λμμλ νλμ endpoint λ§ λ°μ§λ§, κ°μ λ μ½λμμλ string μ ellipsis λ‘ λ°μ 2κ° μ΄μμ endpoint λ μΈμλ‘ λ°μ μ μκ² λλ€.
// κΈ°μ‘΄
func mustConnectRedis(endpoint string) redis.UniversalClient {
...
redisClient := redis.NewUniversalClient(&redis.UniversalOptions{
Addrs: endpoint,
ReadOnly: true,
})
}
mustConnectRedis("127.0.0.1:6379")
// μ¬λΌμ΄μ€ νμ₯νλλ‘ κ°μ
func mustConnectRedis(endpoint ...string) redis.UniversalClient {
...
redisClient := redis.NewUniversalClient(&redis.UniversalOptions{
Addrs: endpoint,
ReadOnly: true,
})
}
mustConnectRedis("127.0.0.1:6379", "127.0.0.1:6380")
μ£Όμμ¬νκ³Ό ν
1. κ°λ³μΈμλ νμ ν¨μ λ§μ§λ§ 맀κ°λ³μμ¬μΌ νλ€.
// μ¬λ°λ₯Έ μ¬μ©
func correct(prefix string, numbers ...int)
// μλͺ»λ μ¬μ©
func incorrect(numbers ...int, prefix string) // μ»΄νμΌ μλ¬
2. νμ μμ μ± μ μ§
func betterFunction(numbers ...int) // interface{} λμ ꡬ체μ μΈ νμ
μ¬μ© κΆμ₯
func avoidThis(args ...interface{}) // κ°λ₯νλ©΄ νΌν κ²
3. μμ λ°μ΄ν° μ μμ μ¬μ© κΆμ₯
κ°λ μ± μΈ‘λ©΄μμ ν° μ₯μ μ 보μ΄λ ellipsis μ§λ§ μ±λ₯ μΈ‘λ©΄λ κ³ λ €ν΄μΌ νλ€.
ellipsis λ₯Ό μ¬μ©νλ©΄ λ΄λΆμ μΌλ‘ μ¬λΌμ΄μ€κ° μμ±λλ―λ‘ λ§€μ° ν° λ°μ΄ν° μ μ λ€λ£° λλ μ§μ μ¬λΌμ΄μ€λ₯Ό μ λ¬νλ κ²μ΄ λ ν¨μ¨μ μ΄κΈ° λλ¬Έμ΄λ€. μλ μ½λλ₯Ό 보며 μμΈν μμ보μ.
func sum(numbers ...int) int {
// numbersλ λ΄λΆμ μΌλ‘ μ¬λΌμ΄μ€λ‘ λ³νλ¨
total := 0
for _, num := range numbers {
total += num
}
return total
}
// νΈμΆ μ
sum(1, 2, 3)
sum() μ΄ μ€νλ λ λ΄λΆμ μΌλ‘ μΌμ΄λλ μΌμ μ 리νλ©΄,
1. μλ‘μ΄ μ¬λΌμ΄μ€κ° μμ±λ¨
2. μΈμλ€ (1,2,3)μ΄ μ¬λΌμ΄μ€λ‘ 볡μ¬λ¨
3. ν¨μ λ΄λΆμμ μ¬λΌμ΄μ€λ₯Ό μ¬μ©ν¨.
μ μμμ²λΌ μ μ μμ μΈμκ° μ¬λΌμ΄μ€λ‘ 볡μ¬λμ΄λ μ±λ₯ μ°¨μ΄λ κ±°μ λ°μνμ§ μμ κ±°λΌ μκ°νλ€. νμ§λ§ λ§μ½ ν¬κΈ°κ° (μ€λ²ν΄μ) 100λ§μΈ μ¬λΌμ΄μ€λ₯Ό μ΄κΈ°ννμ¬ ellipsis λ‘ λκΈ΄λ€κ³ κ°μ ν΄λ³΄μ.
μΌμ΄μ€ 1 μ²λΌ μ¬λΌμ΄μ€λ₯Ό νμ₯νλ©΄ sumVariadic() λ΄λΆμμ ν¬κΈ°κ° 100λ§μΈ μ¬λΌμ΄μ€κ° μλ‘ μμ±λμ΄ λ³΅μ¬λλ©° μ΄λ¬ν μμ μ΄ λ°λ³΅λλ©΄ μ¬κ°ν λ©λͺ¨λ¦¬ λ¬Έμ λ₯Ό μ΄λν μ μλ€.
λλ¬Έμ λ°μ΄ν° μ μ΄ λ무 μ»€μ§ κ² κ°μ λ ellipsis λ₯Ό μ¬μ©νκΈ° λ³΄λ€ μΌμ΄μ€ 2 μ²λΌ κΈ°μ‘΄ μ¬λΌμ΄μ€λ₯Ό μ§μ μ¬μ©νλ κ²μ΄ λ©λͺ¨λ¦¬ μΈ‘λ©΄μμ ν¨μ¨μ μ΄λΌ μκ°νλ€.
numbers := make([]int, 1000000)
// μΌμ΄μ€ 1: μΆκ°μ μΈ μ¬λΌμ΄μ€ μμ± λ° λ³΅μ¬ λ°μ
sumVariadic(numbers...)
// μΌμ΄μ€ 2: κΈ°μ‘΄ μ¬λΌμ΄μ€ μ§μ μ¬μ© (μΆκ° λ©λͺ¨λ¦¬ ν λΉ μμ)
sumSlice(numbers)
μ 리νλ©΄
ellipsis λ₯Ό μ¬μ©νλ μ΄μ λ μ½λ μ μ°μ±κ³Ό μ¬μ¬μ©μ±μ ν₯μμν¬ μ μλ€. ν¨μ νΈμΆ μ λ κΉλνκ³ μ§κ΄μ μΈ λ¬Έλ²μ μ¬μ©νμ¬ κ°λ μ±μ λμΌ μ μκ³ , 맀κ°λ³μ κ°μμ μ μ°μ±λ λμ΄λ μ₯μ μ λ Έλ¦΄ μ μλ€. λ¨ μ¬λΌμ΄μ€λ₯Ό νμ₯νλ©΄ ν¨μ λ΄λΆμμ ν΄λΉ μ¬λΌμ΄μ€ ν¬κΈ°λ§νΌ μλ‘μ΄ μ¬λΌμ΄μ€λ₯Ό μμ±νκ³ λ³΅μ¬νλ μμ μ΄ λ°μν μ μλ€. λλ¬Έμ ν¬κΈ°κ° ν° λ°μ΄ν°λ₯Ό μ¬μ©νλ κ²½μ°λΌλ©΄ λ©λͺ¨λ¦¬ μΈ‘λ©΄λ κ³ λ €νμ¬ ellipsis λ₯Ό μ μ ν μ¬μ©νλ κ²μ κΆμ₯νλ€.