ComparisonOperator.go

package main

import (
	"fmt"
	"math/big"
)

// ComparisonOperator κ΅¬μ‘°μ²΄λŠ” 비ꡐ 연산을 μœ„ν•œ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
type ComparisonOperator struct{}

// Eq ν•¨μˆ˜λŠ” 두 값이 같은지 ν™•μΈν•©λ‹ˆλ‹€.
func (co *ComparisonOperator) Eq(vars []interface{}) bool {
	left, right := co.parseVars(vars)
	if left != nil && right != nil {
		return left.Cmp(right) == 0
	}
	return vars[0] == vars[1]
}

// Ne ν•¨μˆ˜λŠ” 두 값이 κ°™μ§€ μ•Šμ€μ§€ ν™•μΈν•©λ‹ˆλ‹€.
func (co *ComparisonOperator) Ne(vars []interface{}) bool {
	left, right := co.parseVars(vars)
	if left != nil && right != nil {
		return left.Cmp(right) != 0
	}
	return vars[0] != vars[1]
}

// Gt ν•¨μˆ˜λŠ” 첫 번째 값이 두 번째 값보닀 큰지 ν™•μΈν•©λ‹ˆλ‹€.
func (co *ComparisonOperator) Gt(vars []interface{}) bool {
	left, right := co.parseVars(vars)
	if left != nil && right != nil {
		return left.Cmp(right) > 0
	}
	return vars[0].(string) > vars[1].(string)
}

// Gte ν•¨μˆ˜λŠ” 첫 번째 값이 두 번째 값보닀 ν¬κ±°λ‚˜ 같은지 ν™•μΈν•©λ‹ˆλ‹€.
func (co *ComparisonOperator) Gte(vars []interface{}) bool {
	left, right := co.parseVars(vars)
	if left != nil && right != nil {
		return left.Cmp(right) >= 0
	}
	return vars[0].(string) >= vars[1].(string)
}

// Lt ν•¨μˆ˜λŠ” 첫 번째 값이 두 번째 값보닀 μž‘μ€μ§€ ν™•μΈν•©λ‹ˆλ‹€.
func (co *ComparisonOperator) Lt(vars []interface{}) bool {
	left, right := co.parseVars(vars)
	if left != nil && right != nil {
		return left.Cmp(right) < 0
	}
	return vars[0].(string) < vars[1].(string)
}

// Lte ν•¨μˆ˜λŠ” 첫 번째 값이 두 번째 값보닀 μž‘κ±°λ‚˜ 같은지 ν™•μΈν•©λ‹ˆλ‹€.
func (co *ComparisonOperator) Lte(vars []interface{}) bool {
	left, right := co.parseVars(vars)
	if left != nil && right != nil {
		return left.Cmp(right) <= 0
	}
	return vars[0].(string) <= vars[1].(string)
}

// parseVars ν•¨μˆ˜λŠ” 두 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
func (co *ComparisonOperator) parseVars(vars []interface{}) (*big.Float, *big.Float) {
	left, ok1 := co.toBigFloat(vars[0])
	right, ok2 := co.toBigFloat(vars[1])
	if ok1 && ok2 {
		return left, right
	}
	return nil, nil
}

// toBigFloat ν•¨μˆ˜λŠ” λ‹€μ–‘ν•œ νƒ€μž…μ˜ 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
func (co *ComparisonOperator) toBigFloat(val interface{}) (*big.Float, bool) {
	switch v := val.(type) {
	case int:
		return big.NewFloat(float64(v)), true
	case int64:
		return big.NewFloat(float64(v)), true
	case float64:
		return big.NewFloat(v), true
	case string:
		f, _, err := big.ParseFloat(v, 10, 0, big.ToNearestEven)
		if err == nil {
			return f, true
		}
	}
	return nil, false
}

func main() {
	co := &ComparisonOperator{}
	vars := []interface{}{"123.45", "123.45"}

	fmt.Println("Eq:", co.Eq(vars))  // true
	fmt.Println("Ne:", co.Ne(vars))  // false
	fmt.Println("Gt:", co.Gt(vars))  // false
	fmt.Println("Gte:", co.Gte(vars)) // true
	fmt.Println("Lt:", co.Lt(vars))  // false
	fmt.Println("Lte:", co.Lte(vars)) // true
}

μ„€λͺ…

이 μ½”λ“œλŠ” λ‹€μ–‘ν•œ 비ꡐ 연산을 μˆ˜ν–‰ν•  수 μžˆλŠ” ComparisonOperator ꡬ쑰체와 κ·Έ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

  1. ComparisonOperator ꡬ쑰체:

    • 비ꡐ 연산을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

  2. Eq ν•¨μˆ˜:

    • vars λ°°μ—΄μ˜ 두 값이 같은지 λΉ„κ΅ν•©λ‹ˆλ‹€.

    • parseVars ν•¨μˆ˜λ₯Ό 톡해 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•œ ν›„ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜μ΄ μ‹€νŒ¨ν•œ 경우, μΈν„°νŽ˜μ΄μŠ€μ˜ κΈ°λ³Έ κ°’μœΌλ‘œ λΉ„κ΅ν•©λ‹ˆλ‹€.

  3. Ne ν•¨μˆ˜:

    • vars λ°°μ—΄μ˜ 두 값이 κ°™μ§€ μ•Šμ€μ§€ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • parseVars ν•¨μˆ˜λ₯Ό 톡해 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•œ ν›„ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜μ΄ μ‹€νŒ¨ν•œ 경우, μΈν„°νŽ˜μ΄μŠ€μ˜ κΈ°λ³Έ κ°’μœΌλ‘œ λΉ„κ΅ν•©λ‹ˆλ‹€.

  4. Gt ν•¨μˆ˜:

    • vars λ°°μ—΄μ˜ 첫 번째 값이 두 번째 값보닀 큰지 λΉ„κ΅ν•©λ‹ˆλ‹€.

    • parseVars ν•¨μˆ˜λ₯Ό 톡해 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•œ ν›„ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜μ΄ μ‹€νŒ¨ν•œ 경우, λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

  5. Gte ν•¨μˆ˜:

    • vars λ°°μ—΄μ˜ 첫 번째 값이 두 번째 값보닀 ν¬κ±°λ‚˜ 같은지 λΉ„κ΅ν•©λ‹ˆλ‹€.

    • parseVars ν•¨μˆ˜λ₯Ό 톡해 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•œ ν›„ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜μ΄ μ‹€νŒ¨ν•œ 경우, λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

  6. Lt ν•¨μˆ˜:

    • vars λ°°μ—΄μ˜ 첫 번째 값이 두 번째 값보닀 μž‘μ€μ§€ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • parseVars ν•¨μˆ˜λ₯Ό 톡해 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•œ ν›„ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜μ΄ μ‹€νŒ¨ν•œ 경우, λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

  7. Lte ν•¨μˆ˜:

    • vars λ°°μ—΄μ˜ 첫 번째 값이 두 번째 값보닀 μž‘κ±°λ‚˜ 같은지 λΉ„κ΅ν•©λ‹ˆλ‹€.

    • parseVars ν•¨μˆ˜λ₯Ό 톡해 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•œ ν›„ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜μ΄ μ‹€νŒ¨ν•œ 경우, λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

  8. parseVars ν•¨μˆ˜:

    • vars λ°°μ—΄μ˜ 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

    • λ³€ν™˜μ΄ μ„±κ³΅ν•˜λ©΄ λ³€ν™˜λœ 값을 λ°˜ν™˜ν•˜κ³ , μ‹€νŒ¨ν•˜λ©΄ nil을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

  9. toBigFloat ν•¨μˆ˜:

    • λ‹€μ–‘ν•œ νƒ€μž…μ˜ 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

    • μ§€μ›λ˜λŠ” νƒ€μž…μ€ int, int64, float64, stringμž…λ‹ˆλ‹€.

    • λ³€ν™˜μ΄ μ„±κ³΅ν•˜λ©΄ λ³€ν™˜λœ 값을 λ°˜ν™˜ν•˜κ³ , μ‹€νŒ¨ν•˜λ©΄ nil을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

예제 μ‚¬μš©

main ν•¨μˆ˜λŠ” ComparisonOperator ꡬ쑰체λ₯Ό μƒμ„±ν•˜κ³ , Eq, Ne, Gt, Gte, Lt, Lte λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 두 값을 λΉ„κ΅ν•˜λŠ” 예제λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

μ½”λ“œ μ„€λͺ…

  1. ComparisonOperator ꡬ쑰체

    • λ‹€μ–‘ν•œ 비ꡐ 연산을 μˆ˜ν–‰ν•˜λŠ” λ©”μ„œλ“œλ“€μ„ μ •μ˜ν•œ κ΅¬μ‘°μ²΄μž…λ‹ˆλ‹€.

  2. Eq ν•¨μˆ˜

    • 두 값이 같은지 ν™•μΈν•©λ‹ˆλ‹€.

    • 숫자 값은 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜λœ 값이 nil이 μ•„λ‹ˆλ©΄ Cmp λ©”μ„œλ“œλ‘œ λΉ„κ΅ν•˜κ³ , κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ κΈ°λ³Έ 비ꡐ 연산을 μ‚¬μš©ν•©λ‹ˆλ‹€.

  3. Ne ν•¨μˆ˜

    • 두 값이 λ‹€λ₯Έμ§€ ν™•μΈν•©λ‹ˆλ‹€.

    • 숫자 값은 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜λœ 값이 nil이 μ•„λ‹ˆλ©΄ Cmp λ©”μ„œλ“œλ‘œ λΉ„κ΅ν•˜κ³ , κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ κΈ°λ³Έ 비ꡐ 연산을 μ‚¬μš©ν•©λ‹ˆλ‹€.

  4. Gt ν•¨μˆ˜

    • 첫 번째 값이 두 번째 값보닀 큰지 ν™•μΈν•©λ‹ˆλ‹€.

    • 숫자 값은 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜λœ 값이 nil이 μ•„λ‹ˆλ©΄ Cmp λ©”μ„œλ“œλ‘œ λΉ„κ΅ν•˜κ³ , κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λ¬Έμžμ—΄ 비ꡐ 연산을 μ‚¬μš©ν•©λ‹ˆλ‹€.

  5. Gte ν•¨μˆ˜

    • 첫 번째 값이 두 번째 값보닀 ν¬κ±°λ‚˜ 같은지 ν™•μΈν•©λ‹ˆλ‹€.

    • 숫자 값은 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜λœ 값이 nil이 μ•„λ‹ˆλ©΄ Cmp λ©”μ„œλ“œλ‘œ λΉ„κ΅ν•˜κ³ , κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λ¬Έμžμ—΄ 비ꡐ 연산을 μ‚¬μš©ν•©λ‹ˆλ‹€.

  6. Lt ν•¨μˆ˜

    • 첫 번째 값이 두 번째 값보닀 μž‘μ€μ§€ ν™•μΈν•©λ‹ˆλ‹€.

    • 숫자 값은 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜λœ 값이 nil이 μ•„λ‹ˆλ©΄ Cmp λ©”μ„œλ“œλ‘œ λΉ„κ΅ν•˜κ³ , κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λ¬Έμžμ—΄ 비ꡐ 연산을 μ‚¬μš©ν•©λ‹ˆλ‹€.

  7. Lte ν•¨μˆ˜

    • 첫 번째 값이 두 번째 값보닀 μž‘κ±°λ‚˜ 같은지 ν™•μΈν•©λ‹ˆλ‹€.

    • 숫자 값은 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

    • λ³€ν™˜λœ 값이 nil이 μ•„λ‹ˆλ©΄ Cmp λ©”μ„œλ“œλ‘œ λΉ„κ΅ν•˜κ³ , κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λ¬Έμžμ—΄ 비ꡐ 연산을 μ‚¬μš©ν•©λ‹ˆλ‹€.

  8. parseVars ν•¨μˆ˜

    • 두 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

  9. toBigFloat ν•¨μˆ˜

    • μ£Όμ–΄μ§„ 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

    • int, int64, float64, string νƒ€μž…μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

main ν•¨μˆ˜

  • ComparisonOperator ꡬ쑰체의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  λ‹€μ–‘ν•œ 비ꡐ 연산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • 각 μ—°μ‚° κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

Last updated