ورودی کاربر (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 امتحان کنید!

این مبحث بخشی از دوره آموزش کامل گو است.

ابزارهای مرتبط