முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 8 · பாடம் 3 இன் 5பாடத்திட்டத்தில் 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 திறக்கிறது, எல்லாவற்றையும் நினைவகத்தில் படித்து மூடுகிறது. சில எம்பி வரை சரியானது; அதையும் தாண்டி, ஸ்ட்ரீமிங் சிறந்தது.

ஸ்ட்ரீமிங்கிற்கான கோப்புகளைத் திறக்கிறது

பெரிய கோப்புகள் அல்லது அதிகரிக்கும் அணுகலுக்கு, கோப்பைத் திறந்து 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.O_APPEND | os.O_CREATE | os.O_WRONLY போன்ற கொடிகளுடன் os.OpenFile(path, flag, perm) ஐப் பயன்படுத்தவும்.

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 பதிலை அனுப்பலாம் (__AGYTOK_INLINE_19), 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ஏற்றுகிறது…

'ciao' என்ற சரத்தை 'out.txt' கோப்பில் os.WriteFile உடன் எழுதவும் (அனுமதிகள் 0644). பிழையைக் கையாளவும்.

எடிட்டரை ஏற்றுகிறது…

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

Quiz#go.m8.l3.e3
தயார்

os.Args இல் உள்ள நிரல் பெயரின் குறியீடு என்ன?

Go
fmt.Println(os.Args[???])
பதில் விருப்பங்கள்