Golang เขียน function ยังไงให้รับได้ทั้ง *sql.DB และ *sql.Tx ?

เนื่องจากว่า sql.DB และ sql.Tx เป็น struct ทั้งคู่ ถ้าเราจะเขียน function ที่ต้องรับค่าทั้ง 2 ตัว จะทำยังไง ? ต้องเขียน 2 functions แบบนี้เลยไหม ?

เราสามารถเอา interface มาแก้ปัญหานี้ได้ เนื่องจากว่าใน Go, type อะไรก็ตามที่มี method ตามที่อยู่ใน interface จะถึงว่า type นั้น ๆ implement interface นั้นเลย (Interfaces are implemented implicitly) โดยที่ไม่ต้องเขียน implement เหมือนภาษาอื่น ทำให้เราสามารถสร้าง interface ทีหลัง ให้กับสิ่งที่มีอยู่แล้วได้

เราสามารถแก้ไข้ปัญหานี้ได้ด้วยการสร้าง interface ที่ sql.DB และ sql.Tx implement มัน

เท่านี้ function findUserIDFromEmail ก็สามารถรับได้ทั้ง *sql.DB และ *sql.Tx แล้ว