GO语言工程实践课后作业 | 青训营

100 阅读3分钟

我们最近上了一门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语言功底,更让他我对自己的工程实践能力有了信心。我会以此为基础,继续努力学习,在以后的项目中发挥所学,成为一名合格的后端工程师。这段学习经历我会铭记于心,它是我编程之路上的重要一步。