阅读 Go 实战:Web 入门 遇到的坑

问题1

阅读教程8.4 删除按钮 如果你顺着教程来你就会发现,打开 /articles/1 详情页

会有一个错误

2022/02/14 13:13:42 template: show.gohtml:20:17: executing "show.gohtml" at <RouteName2URL "articles.delete" "id" $idString>: error calling RouteName2URL: runtime error: invalid memory address or nil pointer dereference

而这个问题的解决方案在8.5


在此之前我们的代码结构是8.3

如果按照小白来说卡住就会从头开始阅读文章看那个地方有错,但是往上看再多也是没问的, 因为作者放到8.5用了解决 Link() 方法, 但是前面有个 Name2URL方法也需要用到. 也就是说以8.3的代码结构无法正常运行Name2URL方法方法

问题2

阅读教程 8.4 Article 模型,可以看见顺着教程来的话你的ID类型为uint64

阅读教程 8.5 重构文章列表页, 但是到了8.5重构文章列表页用了 strconv.FormatInt 而不是用 strconv.FormatUint 方法,不知道是不是我教程看漏了还是 Article.ID 类型改变了,而且我也没明白a那里来的

于是我稍作修改才能正常运行,可能是我敲错

goblog\resources\views\articles\show.gohtml

问题3

顺着教程做到 8.4你会发现有的代码不注释掉压根没法运行

读后感,我读了8章, 1-6章顺着下了没问题, 但是 7-8章有问题,大部分时间用来找bug了, 感觉比以前laravel教程 和 vue教程有点需要改进的…

问题4

8.9 重构中间件, 如果仔细和8.5 对比会发现这里没有 route.SetRoute(router) 这行代码, 如果少了 route.SetRoute(router)
阅读 Go 实战:Web 入门 遇到的坑
如果没有就会出现这种错误

2022/02/14 14:44:59 template: index.gohtml:11:32: executing "index.gohtml" at <$article.Link>: error calling Link: runtime error: invalid memory address or nil pointer dereference

所以完整的因该是这样的

package main

import (
    "goblog/app/middlewares"
    "goblog/bootstrap"
    "goblog/pkg/logger"
    "goblog/pkg/route"
    "net/http"
)

/**
 * 主方法
 */
func main() {
    bootstrap.SetupDB()              //数据库初始化
    router := bootstrap.SetupRoute() //路由初始化
    route.SetRoute(router)

    err := http.ListenAndServe(":3000", middlewares.RemoveTrailingSlash(router))
    logger.LogError(err)
}
本帖已被设为精华帖!
本帖由系统于 1年前 自动加精
讨论数量: 8
任飘渺

这章的体验很糟糕 第一遍跟着教材走 兜兜转转绕晕了

2年前 评论
Tangqy 2年前

问题2 中提及的内容,在我现在看的文档中已经是如下描述。所以至少 FormatUint的事情已经解释了。

file

至于Link 本身的实现,我觉得应该是:

func (a Article) Link() string {
    return route.Name2URL("articles.show", "id", types.Uint64ToString(a.ID))
}

为什么一会儿是a 而方法的接收者在文章中写成了article呢。是因为方法的代码是从main.go中拷贝过来的,当时在main中的定义时,接收者是a:

func (a Article) Link() string {
    showUrl, err := router.Get("articles.show").URL("id", strconv.FormatInt(a.ID, 10))
    if err != nil {
        logger.LogError(err)
        return ""
    }
    return showUrl.String()
}
2年前 评论

谢谢大佬,我在8.3困了半天 :joy: 这两章体验对新手真的不太好

2年前 评论

我改了半天 原来你这里已经都总结好了 :joy:

2年前 评论

买了(根本没学🤣😂🤣)还有 你可以提交建议和修改哦

1年前 评论
CleverBilly

file

file 还是有问题

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!