【问题标题】:What does this line of Golang do exactly? Why pointers? Why the 0 param?Golang 的这行代码到底是做什么的?为什么是指针?为什么是 0 参数?
【发布时间】:2016-04-24 18:49:49
【问题描述】:

我在 Go 中的 PostgreSQL 上关注 this tutorial,它有以下行:

  bks := make([]*Book, 0)

这是更大代码块的一部分:

  bks := make([]*Book, 0)
  for rows.Next() {
    bk := new(Book)
    err := rows.Scan(&bk.isbn, &bk.title, &bk.author, &bk.price)
    if err != nil {
      log.Fatal(err)
    }
    bks = append(bks, bk)
  }

为什么作者在make中传递0?我知道那是长度,但为什么长度为 0?为什么它是指针数组而不是书籍数组?你不想要一个切片,这样你就可以在里面任意插入书籍了吗?

【问题讨论】:

    标签: postgresql go


    【解决方案1】:

    你不想要一个切片,这样你就可以在其中任意插入书籍了吗?

    make([]Type, initLength) 创建Type 类型值的切片。当initLength > 0 时,切片会预先填充许多Type 类型的零值实例。在这种情况下,作者不希望有任何零值,而是选择附加从数据库接收到的非零值。所以bks确实是一个切片。

    示例:http://play.golang.org/p/g0dALT-sLn

    更多信息:http://blog.golang.org/go-slices-usage-and-internals

    为什么它是 slice 指针而不是 slice 书籍?

    如果没有更多上下文,这很难回答。使用指向 Book 的指针将允许您存储 nil 值,这可能很有用,具体取决于 bks 的使用方式。

    您链接到的教程没有显示bks 以任何方式使用值是指针这一事实。您可以毫无问题地将切片转换为[]Book 类型。

    【讨论】:

    • 您还可以使用 make(T, 0, cap) 预初始化切片的 容量 - 当您知道有多少个结果(或至少是最小数量)时,这很有用会有的。
    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2015-12-23
    • 2014-01-29
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多