మాడ్యూల్ పాఠాలు (3/5)
`io` మరియు `os`: ఫైల్లు మరియు స్ట్రీమ్లు
Goలో ఫైల్లు మరియు స్ట్రీమ్లను చదవడం మరియు వ్రాయడం అనేది రెండు పరిపూరకరమైన ప్యాకేజీల చుట్టూ తిరుగుతుంది: os (ఓపెనింగ్, క్రియేషన్, మెటాడేటా, ప్రాసెస్లు) మరియు io (Reader/Writer ఇంటర్ఫేస్ ద్వారా ఏదైనా ఇంటర్ఫేస్ ఆ సోర్స్).
ఫైల్లను చదవడం మరియు వ్రాయడం: సత్వరమార్గాలు
చిన్న లేదా కాన్ఫిగరేషన్ ఫైల్ల కోసం, ఒకే కాల్ సరిపోతుంది:
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తో మూసివేయండి:
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: యూనివర్సల్ ఇంటర్ఫేస్లు
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.
// 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 నుండి:
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 ఆమోదించబడినా మీరు వాటిని పాస్ చేయవచ్చు.
fmt.Fprintln(os.Stderr, "log diagnostico")
io.Copy(os.Stdout, os.Stdin) // echoవ్యాయామాలు
మొదటి కమాండ్-లైన్ ఆర్గ్యుమెంట్ (os.Args[1])ని ప్రింట్ చేయండి. అది తప్పిపోయినట్లయితే, 'manca argomento'ని ప్రింట్ చేసి, తిరిగి ఇవ్వండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
os.WriteFile (అనుమతులు 0644)తో 'ciao' అనే స్ట్రింగ్ను 'out.txt' ఫైల్కి వ్రాయండి. లోపాన్ని నిర్వహించండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
os.Argsలో ప్రోగ్రామ్ పేరు యొక్క సూచిక ఏమిటి?
fmt.Println(os.Args[???])