서문 : 주장하지 않고if else
갈 길이 , 우리는 여전히 언어 기반 구조를 가지고 놀고 즐거움을 찾을 수 있습니다.
다음 If
구성은 github.com/icza/gox
라이브러리에서 다른 많은 방법으로 사용할 수 있으며 builtinx.If
유형입니다.
Go 는와 같은 기본 유형을 포함 하여 모든 사용자 정의 유형 에 메소드를 첨부 할 수 있습니다 bool
. 기본 유형bool
으로 사용자 정의 유형을 작성한 다음 조건에 대한 간단한 유형 변환 으로 메소드에 액세스 할 수 있습니다. 피연산자를 받고 선택하는 메소드입니다.
이 같은:
type If bool
func (c If) Int(a, b int) int {
if c {
return a
}
return b
}
어떻게 사용할 수 있습니까?
i := If(condition).Int(val1, val2) // Short variable declaration, i is of type int
|-----------| \
type conversion \---method call
예를 들어 삼항 max()
:
i := If(a > b).Int(a, b)
삼항 abs()
:
i := If(a >= 0).Int(a, -a)
멋있고, 단순하고 우아하며 효율적입니다 ( 인라인 에도 적합 함) ).
"실제"삼항 연산자와 비교할 때 한 가지 단점 : 항상 모든 피연산자를 평가합니다.
지연되고 필요한 경우에만 평가를 수행하려면 필요한 경우 / 필요할 때만 호출되는 함수 ( 선언 된 함수 또는 메소드 또는 함수 리터럴 ) 를 사용하는 것이 유일한 옵션입니다 .
func (c If) Fint(fa, fb func() int) int {
if c {
return fa()
}
return fb()
}
그것을 사용 :하자의 우리가 계산에 이러한 기능이 가정 a
및 b
:
func calca() int { return 3 }
func calcb() int { return 4 }
그때:
i := If(someCondition).Fint(calca, calcb)
예를 들어, 현재 연도> 2020 인 조건 :
i := If(time.Now().Year() > 2020).Fint(calca, calcb)
함수 리터럴을 사용하려는 경우 :
i := If(time.Now().Year() > 2020).Fint(
func() int { return 3 },
func() int { return 4 },
)
마지막 참고 사항 : 서명이 다른 기능이있는 경우 여기서 사용할 수 없습니다. 이 경우 서명이 일치하는 함수 리터럴을 사용하여 여전히 적용 할 수 있습니다.
예를 들어 calca()
및 calcb()
매개 변수가있는 경우 (반환 값 외에) :
func calca2(x int) int { return 3 }
func calcb2(x int) int { return 4 }
이것은 당신이 그들을 사용할 수있는 방법입니다 :
i := If(time.Now().Year() > 2020).Fint(
func() int { return calca2(0) },
func() int { return calcb2(0) },
)
Go Playground 에서이 예제를 사용해보십시오 .