我一直在尝试自己学习Go,但在尝试读取和写入普通文件时,我被难住了。

我可以到inFile, _:= os。Open(INFILE, 0,0),但实际上获取文件的内容没有意义,因为read函数以[]字节作为参数。

func (file *File) Read(b []byte) (n int, err Error)

当前回答

这是一个很好的版本(但请注意,ioutil自Go 1.16以来已弃用):

package main

import (
  "io/ioutil"; 
  )


func main() {
  contents,_ := ioutil.ReadFile("plikTekstowy.txt")
  println(string(contents))
  ioutil.WriteFile("filename", contents, 0644)
}

其他回答

[]byte是字节数组的全部或部分的切片(类似于子字符串)。可以将切片看作一个值结构,它带有一个隐藏的指针字段,用于系统定位和访问数组(切片)的全部或部分,加上用于切片长度和容量的字段,您可以使用len()和cap()函数访问这些字段。

这里有一个工作的入门套件,它可以读取和打印二进制文件;您将需要更改inName字面值以引用系统上的一个小文件。

package main
import (
    "fmt";
    "os";
)
func main()
{
    inName := "file-rw.bin";
    inPerm :=  0666;
    inFile, inErr := os.Open(inName, os.O_RDONLY, inPerm);
    if inErr == nil {
        inBufLen := 16;
        inBuf := make([]byte, inBufLen);
        n, inErr := inFile.Read(inBuf);
        for inErr == nil {
            fmt.Println(n, inBuf[0:n]);
            n, inErr = inFile.Read(inBuf);
        }
    }
    inErr = inFile.Close();
}

请注意。由于Go 1.16 ReadFile在os包中。

试试这个:

package main

import (
  "io"; 
  )
  

func main() {
  contents,_ := io.ReadFile("filename");
  println(string(contents));
  io.WriteFile("filename", contents, 0644);
}

这是一个很好的版本(但请注意,ioutil自Go 1.16以来已弃用):

package main

import (
  "io/ioutil"; 
  )


func main() {
  contents,_ := ioutil.ReadFile("plikTekstowy.txt")
  println(string(contents))
  ioutil.WriteFile("filename", contents, 0644)
}

新方法

从Go 1.16开始,使用os。ReadFile将文件加载到内存中,并使用os。从内存写入文件的WriteFile (ioutil。ReadFile现在调用os。ReadFile,已弃用)。

小心操作系统。因为它将整个文件读入内存。

package main

import "os"

func main() {
    b, err := os.ReadFile("input.txt")
    if err != nil {
        log.Fatal(err)
    }

    // `b` contains everything your file has.
    // This writes it to the Standard Out.
    os.Stdout.Write(b)

    // You can also write it to a file as a whole.
    err = os.WriteFile("destination.txt", b, 0644)
    if err != nil {
        log.Fatal(err)
    }
}

你也可以使用FMT包:

package main

import "fmt"

func main(){
    file, err := os.Create("demo.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    
    fmt.Fprint(file, name)
}