[Golang] Why you should use pointer receiver.

Visarut Junsone
Lazy-Dev
Published in
2 min readApr 24, 2019

สวัสดีครับผู้อ่าน ถ้าผู้อ่านที่ได้เข้ามาอ่านในเรื่องนี้อาจจะต้องย้อนกลับไปอ่าน เรื่อง [Golang] How to benchmark and what is it ก่อนเพื่อความเข้าใจในการทำการเปรียบเทียบด้วยการทำ Benchmark เพราะในหัวข้อนี้จะมีการทำ Benchmark เพื่อเปรียบเทียบความเร็วของ pointer receiver กับ การใช้ receiver ปกติ

เปรียบเทียบด้วย Benchmark ให้เห็นจะๆ

เราจะทำการใช้ Code ง่ายๆ แบบ ง่ายแสนง่าย ดังรูป

รูปที่ 1 แสดง Code

จะเห็นว่าใน Code มีการทำฟังก์ชั่น Receiver ทั้ง 2 แบบ ทั้ง Value Receiver และ Pointer Receiver ซึ่งทั้งคู่ return 0 หรือใครจะเขียนอะไรอย่างอื่นเพิ่มก็ได้นะแล้วแต่ แต่ต้องเป็น Code ที่เหมือนกันเพื่อที่จะได้เปรียบเทียบอย่างเห็นได้ชัด

รูปที่ 2 แสดง Code benchmark

รูปที่ 2 นั้นแสดง Code benchmark ของทั้ง 2 ตัวซึ่งเราจะนำมา run ทดสอบที่ละตัวและนำผลลัพท์มาเทียบกัน

ทำการทดสอบ Value Receiver กันก่อนเลย ได้ผลลัพธ์ดังรูปที่ 3

รูปที่ 3 แสดงผลลัพธ์ Value Receiver

จากรูปที่ 3 แสดงผลว่า ได้ทำ loop ไปทั้งหมด 2000000000 ครั้ง ที่ความเร็ว 0.56 Nanosecond per loop และใช้เวลาทั้งหมด 1.336 second

รูปที่ 4 แสดงผลลัพธ์ Pointer Receiver

จากรูปที่ 4 แสดงผลว่า ได้ทำ loop ไปทั้งหมด 2000000000 ครั้ง ที่ความเร็ว 0.27 Nanosecond per loop และใช้เวลาทั้งหมด 0.730 second

แค่นี้ก็เห็นชัดแล้วครับ ว่า Value Receiver vs Pointer Receiver นั้น Pointer Receiver ชนะแบบกินขาดด้านความเร็วกันเลยทีเดียว

ควรจะเลือกใช้ยังไงระหว่างทั้ง 2 ตัวนี้

โดยพื้นฐานเลยคือ

1. อย่าเอา Value Receiver และ Pointer Receiver มาปะปนกัน

2. ถ้านึกอะไรไม่ออกหรือไม่รู้จะใช้อะไร ให้ใช้ Pointer Receiver ไปเลย

Pointer Receiver

เราจำเป็นที่จะต้องใช้ Pointer Receiver เมื่อ มีความต้องการที่จะเปลี่ยนแปลงค่า receiver และ หาก struct มีการใช้ sync.Mutex หรือ การทำ synchronizing ที่คล้ายกัน ก็ควรจะใช้ Pointer Receiver เช่นกัน

แต่มีความเป็นไปได้ที่จะเลือกใช้ Pointer Receiver เมื่อ struct ที่สร้าง หรือ array มีขนาดใหญ่มาก

Value receivers

มีความเป็นไปได้ที่จะเลือกใช้ Value receivers เมื่อ type เป็น map, func, chan, basic type เช่น int เป็นต้น และ array หรือ struct ขนาดเล็กที่เป็น value type

สรุป

โดยสรุปแล้วถ้าผู้อ่าน อ่านมาจนถึงตรงนี้ก็จะเห็นแล้วละครับ ว่า Pointer Receiver นั้น มีความเร็วที่เร็วกว่าแน่นอน เมื่อเปรียบเทียบกันในเ้านความเร็ว แต่อย่างไรก็ตาม เราก็ควรจะเลือกใช้ให้ถูกประเภท ไม่ว่าจะเป็น Pointer Receiver หรือ Value Receiver เพื่อที่จะทำให้ Code โดยรวมมีประสิทธิภาพ แล้วผู้อื่นสามารถเข้าใจได้ง่าย.

--

--

Visarut Junsone
Lazy-Dev

I’m Full-Stack Developer. ReactJS Golang C# Javascript C++ PHP and learning a lot more. Not lazy as it name. “Lazy-Dev”