Golang在结构体属性的首字母上使用小写。

huangapple go评论184阅读模式
英文:

Golang using lowercase for first letter in Struct property

问题

我有一个关于Golang视图模板的问题,我目前在结构体属性中使用小写字母来构建结构体,然后将其作为映射传递给视图。

这是我的结构体示例:

  1. type User struct {
  2. uid int
  3. username, departname string
  4. }

然后我将结构体的集合传递给视图文件:

  1. func (App *App) indexHander(w http.ResponseWriter, r *http.Request) {
  2. rows, err := App.db.Query("SELECT * FROM userinfo")
  3. checkErr(err)
  4. t, _ := template.ParseFiles(App.folderpath + "/list.gtpl")
  5. users := make([]User, 0) // 定义空的用户集合
  6. for rows.Next() {
  7. var uid int
  8. var username string
  9. var departname string
  10. var created string
  11. err = rows.Scan(&uid, &username, &departname, &created)
  12. checkErr(err)
  13. users = append(users, User{uid, username, departname})
  14. }
  15. t.Execute(w, users)
  16. defer rows.Close()
  17. }

以下是我的视图HTML代码:

  1. <html>
  2. <head>
  3. <title></title>
  4. </head>
  5. <body>
  6. <ul>
  7. {{ range . }}
  8. <li>{{ .username }}</li>
  9. {{ end }}
  10. </ul>
  11. </body>
  12. </html>

上述代码给我返回了空的用户数据。

但是,如果在结构体中使用首字母大写,就可以得到正确的结果:

结构体

  1. type User struct {
  2. Uid int
  3. Username, Departname string
  4. }

HTML

  1. <html>
  2. <head>
  3. <title></title>
  4. </head>
  5. <body>
  6. <ul>
  7. {{ range . }}
  8. <li>{{ .Username }}</li>
  9. {{ end }}
  10. </ul>
  11. </body>
  12. </html>

现在它可以正常工作。

有人可以解释一下这种行为吗?

英文:

I have an issue with Golang view template, I currently using lowercase in the struct properties to build the struct then passed it to the view as a map.

here is my Struct look like:

  1. type User struct {
  2. uid int
  3. username, departname string
  4. }

then I passed the collection of structs to the file view:

  1. func (App *App) indexHander(w http.ResponseWriter, r *http.Request) {
  2. rows, err := App.db.Query(&quot;SELECT * FROM userinfo&quot;)
  3. checkErr(err)
  4. t, _ := template.ParseFiles(App.folderpath + &quot;/list.gtpl&quot;)
  5. users := make([]User, 0) // define empty collection of users
  6. for rows.Next() {
  7. var uid int
  8. var username string
  9. var departname string
  10. var created string
  11. err = rows.Scan(&amp;uid, &amp;username, &amp;departname, &amp;created)
  12. checkErr(err)
  13. users = append(users, User{uid, username, departname})
  14. }
  15. t.Execute(w, users)
  16. defer rows.Close()
  17. }

and here is my view html code:

  1. &lt;html&gt;
  2. &lt;head&gt;
  3. &lt;title&gt;&lt;/title&gt;
  4. &lt;/head&gt;
  5. &lt;body&gt;
  6. &lt;ul&gt;
  7. {{ range . }}
  8. &lt;li&gt;{{ .username }}&lt;/li&gt;
  9. {{ end }}
  10. &lt;/ul&gt;
  11. &lt;/body&gt;
  12. &lt;/html&gt;

Those code above gave me empty users data:
Golang在结构体属性的首字母上使用小写。

But however, using capitalize first letter in struct give me working result:

Struct

  1. type User struct {
  2. Uid int
  3. Username, Departname string
  4. }

html

  1. &lt;html&gt;
  2. &lt;head&gt;
  3. &lt;title&gt;&lt;/title&gt;
  4. &lt;/head&gt;
  5. &lt;body&gt;
  6. &lt;ul&gt;
  7. {{ range . }}
  8. &lt;li&gt;{{ .Username }}&lt;/li&gt;
  9. {{ end }}
  10. &lt;/ul&gt;
  11. &lt;/body&gt;
  12. &lt;/html&gt;

it works now

Golang在结构体属性的首字母上使用小写。

Can somebody explain me this behavior ?

答案1

得分: 11

阅读文档这里

为了允许从另一个包中访问标识符,可以将其导出。如果满足以下两个条件,则标识符被导出:

  • 标识符名称的第一个字符是一个 Unicode 大写字母(Unicode 类别 "Lu");
  • 标识符在包块中声明,或者是字段名或方法名。

所有其他标识符都不会被导出。

英文:

read the doc here

An identifier may be exported to permit access to it from another package. An identifier is exported if both:

  • the first character of the identifier's name is a Unicode upper case
    letter (Unicode class "Lu");
  • and the identifier is declared in thepackage block or it is a field
    name or method name.

All other identifiers are not exported.

huangapple
  • 本文由 发表于 2017年5月1日 16:59:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/43716630.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定