ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 8 · 5లో పాఠం 3కోర్సులో 38/50~14 min
మాడ్యూల్ పాఠాలు (3/5)

`io` మరియు `os`: ఫైల్‌లు మరియు స్ట్రీమ్‌లు

Goలో ఫైల్‌లు మరియు స్ట్రీమ్‌లను చదవడం మరియు వ్రాయడం అనేది రెండు పరిపూరకరమైన ప్యాకేజీల చుట్టూ తిరుగుతుంది: os (ఓపెనింగ్, క్రియేషన్, మెటాడేటా, ప్రాసెస్‌లు) మరియు io (Reader/Writer ఇంటర్‌ఫేస్ ద్వారా ఏదైనా ఇంటర్‌ఫేస్ ఆ సోర్స్).

ఫైల్‌లను చదవడం మరియు వ్రాయడం: సత్వరమార్గాలు

చిన్న లేదా కాన్ఫిగరేషన్ ఫైల్‌ల కోసం, ఒకే కాల్ సరిపోతుంది:

Go
data, err := os.ReadFile("input.txt")        // returns []byte
if err != nil {
    return err
}
fmt.Println(string(data))

err = os.WriteFile("out.txt", []byte("ciao"), 0644)

os.ReadFile తెరుచుకుంటుంది, ప్రతిదీ మెమరీలోకి రీడ్ చేస్తుంది మరియు మూసివేయబడుతుంది. కొన్ని MB వరకు పర్ఫెక్ట్; అంతకు మించి, స్ట్రీమింగ్ ఉత్తమం.

స్ట్రీమింగ్ కోసం ఫైల్‌లను తెరవడం

పెద్ద ఫైల్‌లు లేదా ఇంక్రిమెంటల్ యాక్సెస్ కోసం, ఫైల్‌ని తెరిచి, deferతో మూసివేయండి:

Go
f, err := os.Open("big.txt")        // read-only
if err != nil {
    return err
}
defer f.Close()

buf := make([]byte, 4096)
for {
    n, err := f.Read(buf)
    if n > 0 {
        process(buf[:n])
    }
    if err == io.EOF {
        break
    }
    if err != nil {
        return err
    }
}

os.Open చదవడానికి మాత్రమే తెరవబడుతుంది. వ్రాయడానికి os.Create (అది ఉన్నట్లయితే కత్తిరించబడుతుంది) లేదా os.OpenFile(path, flag, perm)ని os.O_APPEND | os.O_CREATE | os.O_WRONLY వంటి ఫ్లాగ్‌లతో ఉపయోగించండి.

io.Reader మరియు io.Writer: యూనివర్సల్ ఇంటర్‌ఫేస్‌లు

Go
type Reader interface { Read(p []byte) (n int, err error) }
type Writer interface { Write(p []byte) (n int, err error) }

ప్రామాణిక లైబ్రరీ io.Readerని ఆమోదించే చోట మీరు ఫైల్ (*os.File), స్ట్రింగ్ (strings.NewReader), *bytes.Buffer, ఒక HTTP ప్రతిస్పందన (io.Reader)ని పాస్ చేయవచ్చు. io.Writer.

Go
// Copy from a Reader to a Writer (e.g. download → file).
n, err := io.Copy(dst, src)

io.Copy అనేది బైట్ పైప్‌లైన్‌లకు వర్క్‌హోర్స్: ఇది బఫరింగ్ మరియు EOFని సరిగ్గా నిర్వహిస్తుంది. io.ReadAll(r) EOF వరకు ప్రతిదీ []byteలో చదువుతుంది.

os.Args: CLI వాదనలు

os.Args అనేది స్ట్రింగ్‌ల స్లైస్: ఇండెక్స్ 0 అనేది ప్రోగ్రామ్ పేరు, వాస్తవ ఆర్గ్యుమెంట్‌లపై 1 నుండి:

Go
func main() {
    if len(os.Args) < 2 {
        fmt.Fprintln(os.Stderr, "uso: prog <nome>")
        os.Exit(1)
    }
    fmt.Println("ciao", os.Args[1])
}

మరింత నిర్మాణాత్మక పార్సింగ్ (ఫ్లాగ్‌లు, డిఫాల్ట్‌లు, సహాయం) కోసం flag ప్యాకేజీని stdlib లేదా cobra వంటి బాహ్య లైబ్రరీల నుండి ఉపయోగించండి.

os.Stdin, os.Stdout, os.Stderr

ఇవి మూడు గ్లోబల్ *os.Fileలు: ఎక్కడ io.Reader లేదా io.Writer ఆమోదించబడినా మీరు వాటిని పాస్ చేయవచ్చు.

Go
fmt.Fprintln(os.Stderr, "log diagnostico")
io.Copy(os.Stdout, os.Stdin)  // echo

వ్యాయామాలు

వ్యాయామం#go.m8.l3.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

మొదటి కమాండ్-లైన్ ఆర్గ్యుమెంట్ (os.Args[1])ని ప్రింట్ చేయండి. అది తప్పిపోయినట్లయితే, 'manca argomento'ని ప్రింట్ చేసి, తిరిగి ఇవ్వండి.

ఎడిటర్ లోడ్ అవుతోంది…

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం#go.m8.l3.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

os.WriteFile (అనుమతులు 0644)తో 'ciao' అనే స్ట్రింగ్‌ను 'out.txt' ఫైల్‌కి వ్రాయండి. లోపాన్ని నిర్వహించండి.

ఎడిటర్ లోడ్ అవుతోంది…

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

Quiz#go.m8.l3.e3
సిద్ధంగా ఉంది

os.Argsలో ప్రోగ్రామ్ పేరు యొక్క సూచిక ఏమిటి?

Go
fmt.Println(os.Args[???])
సమాధాన ఎంపికలు