我们最近上了一门GO语言的课程,老师布置了一个课程作业,需要我们实现一个小型的基于命令行的社交网络应用的后端服务。这个作业非常有意义,不仅让我进一步掌握了GO语言的知识,也对后端工程有了更直观的理解。在这里我简单记录下这个作业的实现过程和心得体会。
作业需求主要包括用户注册登录、发布动态、评论等基本功能。我选择了使用GO语言的net/http包实现Web服务,并使用MySQL作为数据库,通过database/sql接口与数据库交互。具体的实现路径是:首先设计了用户、动态、评论三个模型,并使用GORM实现了模型对应的数据库CURD操作。然后Built用户注册登录的接口,通过密码加密、Token授权完成认证流程。接下来Built发布动态、评论的接口,并实现给动态点赞、获取动态排行等功能。最后Built了简单的页面,完成了一个基础的命令行微博应用。
在实现用户注册登录方面,我编写了以下结构体表示用户信息:
go
type User struct {
ID int
Username string
PasswordHash string
Email string
}
注册接口验证输入参数后,会使用bcrypt加密密码,并保存用户信息:
go
func Register(username, password, email string) error {
// 参数校验
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), 12)
user := User{
Username: username,
PasswordHash: hashedPassword,
Email: email
}
db.Save(&user)
return nil
}
登录接口通过验证密码的哈希,生成JWT token:
go
func Login(username, password string) (string, error) {
var user User
db.Where("username = ?", username).First(&user)
if bcrypt.CompareHashAndPassword(user.PasswordHash, []byte(password)) == nil {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"sub": user.ID,
"exp": time.Now().Add(time.Hour * 24).Unix()
})
return token.SignedString(mySigningKey)
}
return "", errors.New("invalid password")
}
发布动态接口实现了给动态加上用户ID、发布时间等信息:
go
type Post struct {
ID int
UserID int
Content string
Created time.Time
}
func PublishPost(userID int, content string) error {
post := Post{
UserID: userID,
Content: content,
Created: time.Now()
}
db.Save(&post)
return nil
}
这个作业历时一周完成,让我对GO语言的理解更加透彻,尤其是接口开发、数据库操作方面有了直接的代码实践。同时对我来说,最宝贵的还是对后端工程的思考。我认识到后端开发需要考虑扩展性、安全性、并发、性能等方方面面,这对我来说是很好的锻炼。在编码过程中,我也遇到了一些困难,比如数据库联表查询、密码加密逻辑、接口优化等。但靠自己努力学习和老师指导,我都一一攻克了。虽然目前我的能力还很有限,但这趟GO语言之旅,真正让我体会到了编程的魅力。我会继续努力,以此作业为基础,掌握更多后端技能。
虽然这个作业只是入门级的,但对我来说意义重大。它不仅检验了我的GO语言功底,更让他我对自己的工程实践能力有了信心。我会以此为基础,继续努力学习,在以后的项目中发挥所学,成为一名合格的后端工程师。这段学习经历我会铭记于心,它是我编程之路上的重要一步。