HOW - Kratos 入门实践(二)- 概念学习

文章目录

  • 前言
  • [一、Go 基础](#一、Go 基础)
    • [1 struct(类似 TypeScript interface + class)](#1 struct(类似 TypeScript interface + class))
    • [2 interface(依赖抽象)](#2 interface(依赖抽象))
    • [3 context(请求生命周期)](#3 context(请求生命周期))
    • [4 goroutine(轻量线程)](#4 goroutine(轻量线程))
    • [5 channel(并发通信)](#5 channel(并发通信))
  • [二、HTTP + JSON(后端核心)](#二、HTTP + JSON(后端核心))
    • [一个最简单 HTTP 服务](#一个最简单 HTTP 服务)
    • [在 Kratos 中](#在 Kratos 中)
  • 三、数据库(后端核心能力)
  • [四、Go 数据库访问](#四、Go 数据库访问)
  • 五、一个完整请求链路

前言

HOW - Kratos 入门实践(一) 我们简单介绍过 kratos 框架。

如果我们是前端工程师转 Go 后端,其实不需要把 Go 全部学完。

一般经验上只需要掌握 20% 的核心概念就能写 80% 的后端服务

在第一篇文章里我们提到了:

复制代码
Go基础
HTTP服务
数据库

今天展开阐述。

一、Go 基础

核心其实只有:

复制代码
struct
interface
context
goroutine
channel

语言本身比 JS/TS 简单很多。


1 struct(类似 TypeScript interface + class)

在 Go 里 struct 是一切的基础

前端:

ts 复制代码
interface User {
  id: number
  name: string
}

Go:

go 复制代码
type User struct {
    ID   int
    Name string
}

使用:

go 复制代码
user := User{
    ID: 1,
    Name: "Tom",
}

JSON序列化:

go 复制代码
type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

这和前端的:

复制代码
axios -> JSON -> TS类型

是一模一样的概念。


2 interface(依赖抽象)

很多前端第一次接触 Go 会被 interface 绕晕,其实很简单:

它就是 行为定义

例如:

go 复制代码
type UserRepo interface {
    GetUser(id int) (*User, error)
}

实现:

go 复制代码
type userRepo struct{}

func (r *userRepo) GetUser(id int) (*User, error) {
    return &User{ID: id, Name: "Tom"}, nil
}

这其实和前端的 依赖注入思想一样

比如:

复制代码
Service -> Repository

在 Kratos 中:

复制代码
service
   ↓
biz
   ↓
repo(interface)
   ↓
data

就是靠 interface 解耦。


3 context(请求生命周期)

Go 后端 所有请求都会带 context

例如:

go 复制代码
func GetUser(ctx context.Context, id int) (*User, error)

context 用来控制:

复制代码
超时
取消
trace
request scope

例如:

go 复制代码
ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
defer cancel()

如果数据库 3 秒没返回:

复制代码
自动取消

这在微服务非常重要。


4 goroutine(轻量线程)

Go 的并发核心。

开启一个并发任务只需要:

go 复制代码
go func() {
    fmt.Println("hello")
}()

对比 JS:

复制代码
Promise
async await
worker

goroutine 非常轻量:

复制代码
一个 Go 程序可以跑几十万 goroutine

典型使用:

复制代码
并发请求
批量处理
后台任务

5 channel(并发通信)

Go 的理念:

复制代码
Don't communicate by sharing memory;
share memory by communicating.

用 channel 在 goroutine 之间传数据。

例子:

go 复制代码
ch := make(chan int)

go func() {
    ch <- 1
}()

value := <-ch
fmt.Println(value)

这其实类似:

复制代码
EventEmitter
message queue

二、HTTP + JSON(后端核心)

大多数 Go Web 服务做的事情就是:

复制代码
HTTP -> JSON -> DB

最常见框架:

框架 特点
Gin 最流行
Kratos 微服务
Fiber 高性能

一个最简单 HTTP 服务

go 复制代码
r := gin.Default()

r.GET("/user", func(c *gin.Context) {

    user := User{
        ID: 1,
        Name: "Tom",
    }

    c.JSON(200, user)
})

r.Run()

返回:

json 复制代码
{
  "id":1,
  "name":"Tom"
}

这和前端:

复制代码
fetch -> JSON

完全一致。


在 Kratos 中

请求链路:

复制代码
HTTP
 ↓
server
 ↓
service
 ↓
biz
 ↓
data
 ↓
database

优点:

复制代码
结构清晰
可扩展
适合大型项目

三、数据库(后端核心能力)

后端 80% 的逻辑其实是:

复制代码
CRUD

至少要熟悉:

数据库
MySQL
PostgreSQL

最重要的 SQL

SELECT

sql 复制代码
SELECT id,name
FROM user
WHERE id = 1

SELECT id, name → 只查询 user 表里的 id 和 name 两个列。

FROM user → 数据来源是 user 表。

WHERE id = 1 → 只获取满足条件 id = 1 的行。


JOIN

sql 复制代码
SELECT u.name,o.price
FROM user u
JOIN order o
ON u.id = o.user_id

uo → 分别是 user 表和 order 表的别名。

JOIN → 内连接(默认 INNER JOIN),只返回两个表满足 ON 条件的行。

ON u.id = o.user_id → 两表通过 user.id 和 order.user_id 匹配。

把两个表的数据按照某个关联条件组合在一起,用于查询关联数据。


GROUP BY

sql 复制代码
SELECT user_id, COUNT(*)
FROM order
GROUP BY user_id

GROUP BY user_id → 把 order 表按 user_id 分组。

COUNT(*) → 统计每组的行数。

SELECT user_id, COUNT(*) → 返回每个 user_id 的订单数量。

用于聚合统计,例如计算每个用户的订单数量、总金额等。


INDEX(性能关键)

sql 复制代码
CREATE INDEX idx_user_name
ON user(name);

在 user 表的 name 列上创建一个索引。

idx_user_name → 索引名称。

索引能加快查询速度,尤其是 WHERE、JOIN、ORDER BY 操作。

提高查询性能,是大数据量表必备的优化手段。

没有 index:

复制代码
全表扫描

有 index:

复制代码
O(log n) 查询

四、Go 数据库访问

常见 ORM:

工具
GORM
sqlx
ent

示例:

go 复制代码
var users []User

db.Where("age > ?", 18).Find(&users)

SQL:

复制代码
SELECT * FROM users WHERE age > 18

五、一个完整请求链路

真实请求流程:

复制代码
前端 React
     │
     │ HTTP
     ▼
Kratos HTTP Server
     │
     ▼
Service
     │
     ▼
Biz
     │
     ▼
Repository
     │
     ▼
MySQL

返回:

复制代码
JSON
相关推荐
审判长烧鸡15 分钟前
GO结构体与指针【1】什么时候用指针
go·指针·结构体
凯瑟琳.奥古斯特27 分钟前
Bootstrap快速上手指南
开发语言·前端·css·bootstrap·html
精益数智工坊32 分钟前
拆解制造业仓库物料管理流程:如何通过标准化仓库物料管理流程解决账实不符难题
大数据·前端·数据库·人工智能·精益工程
恶猫36 分钟前
网页自动化模拟操作时,模拟真实按键触发事件【终级方案】
前端·javascript·自动化·vue·网页模拟
phltxy1 小时前
Spring Cloud入门到实战:微服务架构一站式学习
spring cloud·微服务·架构
小羊Yveesss1 小时前
2026年前端开发新趋势:智能协同、工具革新与场景深耕
前端·ai
Dxy12393102161 小时前
HTML中的Canvas可以干哪些事情
前端·html
悟乙己1 小时前
解析 Agent 时代的 HTML PPT SKILLS: html-ppt-skill
前端·html·powerpoint
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_2:(表单分组与高级输入控件实战)
前端·javascript·css·ui·html
ppandss12 小时前
JavaWeb从0到1-DAY4-AJAX
前端·ajax·okhttp