# Golang
> 来源:原 mongodb 集合 `t_blog` · 整理日期:2026-08-25
> 分类 ID:`2023022315480800000000000001` · 排序:12 · 文章数:4
## 目录
1. [3. grpc xds](#3-grpc-xds)
2. [2. grpc health check](#2-grpc-health-check)
3. [1. grpc protoc](#1-grpc-protoc)
4. [4. Go](#4-go)
---
## 1. 3. grpc xds
bid: `2023022315480900000000000020`
该写点什么么...
---
## 2. 2. grpc health check
bid: `2023022315484500000000000019`
##
---
## 3. 1. grpc protoc
bid: `2023022315507600000000000021`
## base consepts
- protobuf
我们可以查看官方文档 [protobuf guides](https://protobuf.dev/programming-guides/proto3/)
简单来说就是一种以 .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](https://github.com/bufbuild/protoc-gen-validate)
作为可执行程序,其作用是将上面的我们定义的.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 菜鸟教程](https://www.runoob.com/go/go-tutorial.html)
## 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())
}
---