【问题标题】:Go Lang to check io.Writer typeGo Lang 检查 io.Writer 类型
【发布时间】:2021-07-12 12:22:20
【问题描述】:

简单的问题。 我不明白一件事。

package main

import (
    "encoding/csv"
    "fmt"
    "log"
    "os"
    "reflect"
)

func main() {
    records := [][]string{
        {"first_name", "last_name", "username"},
        {"Rob", "Pike", "rob"},
        {"Ken", "Thompson", "ken"},
        {"Robert", "Griesemer", "gri"},
    }

    file, _ := os.Create("file.csv")

    fmt.Println(reflect.TypeOf(file))
    fmt.Println(reflect.TypeOf(os.Stdout))

    w := csv.NewWriter(file)

    for _, record := range records {
        if err := w.Write(record); err != nil {
            log.Fatalln("error writing record to csv:", err)
        }
    }

    // Write any buffered data to the underlying writer (standard output).
    w.Flush()

    if err := w.Error(); err != nil {
        log.Fatal(err)
    }
}

Line : w := csv.NewWriter(file) 我检查了方法 -> NewWriter 应该得到 io.Writer 类型的参数。第 21 和 22 行告诉我“file”和“os.Stdout”(也可以放入 NewWriter)具有以下类型: *os.文件 *os.文件 那么怎么可能一切都正常工作呢?在 Go 中变量有不止一种类型是可能的吗?

【问题讨论】:

标签: go types


【解决方案1】:

os.Create 返回*os.File [1],正如你所说。

io.Writer 是一个接口。这意味着,任何实现接口的类型, 可以作为接口。在这种情况下,该类型只需要实现一个Write 函数[2]。

由于os.File 确实实现了Write 函数[3],它可以在任何地方使用 io.Writer 是必需的。

  1. https://golang.org/pkg/os#Create
  2. https://golang.org/pkg/io#Writer
  3. https://golang.org/pkg/os#File.Write

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 2014-06-16
    • 1970-01-01
    • 2016-09-04
    • 2014-08-14
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多