4.6 KiB
Golang
来源:原 mongodb 集合
t_blog· 整理日期:2026-08-25 分类 ID:2023022315480800000000000001· 排序:12 · 文章数:4
目录
1. 3. grpc xds
bid: 2023022315480900000000000020
该写点什么么...
2. 2. grpc health check
bid: 2023022315484500000000000019
3. 1. grpc protoc
bid: 2023022315507600000000000021
base consepts
- protobuf
我们可以查看官方文档 protobuf guides
简单来说就是一种以 .proto 结尾文件,遵循protocol buffer language 语法,其中包含一个或者多个message和service。
notice_service.proto
syntax = "proto3";
package notice.service.v1;
option go_package ="violin-notice/pkg/service/notice.service.v1";
message NoticeMessage {
};
message NoticeResponse {};
service NoticeService {
rpc SendNotice(NoticeMessage) returns (NoticeResponse) {}
}
- protoc protoc guides
作为可执行程序,其作用是将上面的我们定义的.proto文件转换成对应语言的grpc 可用的文件,我们通过对这些文件进行扩展来实现我们想要的场景。
protoc --go_out=./gen --go_opt=paths=source_relative --go-grpc_out=./gen --go-grpc_opt=paths=source_relative notice_service.proto
执行上面命令会生成go语言的两个文件
notice_service_grpc.pb.go
notice_service.pb.go
我们只需要自己写一个notice_service.go 来扩展上述两个文件即可。
package notice_service_v1
import (
"context"
"gopkg.in/gomail.v2"
"log"
"violin-home.cn/common/logs"
)
type NoticeService struct {
UnimplementedNoticeServiceServer
}
func New() *NoticeService {
return &NoticeService{}
}
func (*NoticeService) SendNotice(
ctx context.Context, msg *NoticeMessage) (*NoticeResponse, error) {
// to write logic
return &NoticeResponse{}, nil
}
如何使用grpc
grpc 存在client和server
4. 4. Go
bid: 2023030213489100000000000022
1. 概述
一些简单的概念介绍可以通过下面网站学习到。
golang 菜鸟教程
2. package
golang的包管理模式是树形的,并且有以下规约:
1
树形结构的根节点是main,即项目根目录。
2
文件中的包定义 一定是和该文件所处的文件夹相同
3
文件中定义的函数,如果是像作为第三方包引用,函数的首字母必须大写
# violin-controller 工程为例 https://github.com/simple321vip/violin-controller
ls
main.go controller.go controller_test.go 都是 根目录下的文件,所以他们的package 都是 main
请注意 包 的名字只能是该文件夹的名字,并不包括父级路径
4 引包
引包 包括第三方包 和 项目自定义包
在mod模式下,第三方包存在 $GOPATH/pkg/mod
而自定义包 引入的时候直接从采用 项目相对路径的方式引入
3. 变量与指针
变量分为 值变量和指针变量
4. 函数
1. main() 函数
程序入口函数
2. init() 函数
每一个源文件都可以包含一个init函数,init意为初始化,也表明init函数会在main函数执行之前执行。
3. go func() 函数
并发编程 即异步
4. func() {}() 匿名函数
匿名函数可以通过变量指向匿名函数,可以匿名函数直接执行
// 声明一个函数变量
f := func() int {
return 1
}
// 调用函数
f()
// 也可以直接执行匿名函数
func() int {
return 1
}()
5. func sample() func() int {} 通过匿名函数实现闭包
package main
import "fmt"
func getSequence() func() int {
i:=0
return func() int {
i+=1
return i
}
}
func main(){
/* nextNumber 为一个函数,函数 i 为 0 */
nextNumber := getSequence()
/* 调用 nextNumber 函数,i 变量自增 1 并返回 */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())
/* 创建新的函数 nextNumber1,并查看结果 */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}