คำนำ:หากปราศจากการโต้เถียงนั่นif else
คือหนทางที่จะไปเรายังคงสามารถเล่นและสนุกไปกับโครงสร้างที่ใช้ภาษาได้
โครงสร้างต่อไปนี้If
มีอยู่ในgithub.com/icza/gox
ห้องสมุดของฉันพร้อมด้วยวิธีการอื่นbuiltinx.If
มากมาย
ไปช่วยให้การแนบวิธีการใด ๆที่ผู้ใช้กำหนดชนิด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) },
)
ลองตัวอย่างเหล่านี้บนไปสนามเด็กเล่น