ورودی کاربر (User Input)
خواندن ورودی کاربر در Go با fmt.Scan، bufio.Scanner و bufio.Reader.
خواندن ورودی در Go
سه روش اصلی برای خواندن ورودی کاربر از خط فرمان:
۱. fmt.Scan — سادهترین
var name string
fmt.Print("نام شما: ")
fmt.Scan(&name) ← & یعنی آدرس متغیر
fmt.Println("سلام", name)
علامت
& (ampersand) آدرس حافظه متغیر را میدهد تا Scan بتواند داخلش بنویسد — این مفهوم اشارهگر (Pointer) است.۲. fmt.Scanln — تا انتهای خط
var age int
fmt.Print("سن: ")
fmt.Scanln(&age)
۳. bufio.Scanner — خواندن خط کامل (با فاصله)
import "bufio"
import "os"
reader := bufio.NewReader(os.Stdin)
fmt.Print("نام کامل: ")
name, _ := reader.ReadString(\n\)
name = strings.TrimSpace(name)
چرا bufio؟
fmt.Scan با فاصله متوقف میشود — «علی احمدی» فقط «علی» را میخواند! bufio کل خط را میگیرد:
| روش | ورودی «علی احمدی» |
|---|---|
fmt.Scan | فقط «علی» |
bufio.Reader | «علی احمدی» کامل ✓ |
تبدیل ورودی به عدد
ورودی همیشه رشته است — برای محاسبه باید تبدیل کنید:
input, _ := reader.ReadString(\n\)
num, err := strconv.Atoi(strings.TrimSpace(input))
if err != nil {
fmt.Println("عدد معتبر نیست!")
}
مثال کامل: برنامه تعاملی
reader := bufio.NewReader(os.Stdin)
fmt.Print("نام: ")
name, _ := reader.ReadString(\n\)
fmt.Print("سن: ")
ageStr, _ := reader.ReadString(\n\)
age, _ := strconv.Atoi(strings.TrimSpace(ageStr))
fmt.Printf("سلام %s! سال بعد %d ساله میشوی.\n",
strings.TrimSpace(name), age+1)
در آزمایشگاه آنلاین ما (مرورگری)، ورودی تعاملی کار نمیکند — این مثالها را روی سیستم خودتان با
go run امتحان کنید!این مبحث بخشی از دوره آموزش کامل گو است.