ReadOperator.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
}

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

  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 ꡬ쑰체의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  λ‹€μ–‘ν•œ 비ꡐ 연산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

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

이 μ½”λ“œλŠ” λ‹€μ–‘ν•œ 데이터 νƒ€μž…μ— λŒ€ν•΄ 비ꡐ 연산을 μˆ˜ν–‰ν•˜λ©°, 특히 숫자 값을 *big.Float νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ μ •ν™•ν•œ 비ꡐλ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

Last updated