ProtoBuf、Grpc、GORM、Go-redis 入门基础

一、ProtoBuf、Grpc

ProtoBuf定义:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

说白了,可以将ProtoBuf文件 当作支持语言的代码交换工具

Grpc定义:gRPC 是一个高性能、跨平台、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。

说白了Grpc就是服务、客户端的接口通信标准之一

ProtoBuf、Grpc 的示例

//指定protobuf版本信息,目前最新的版本就是proto3

syntax = "proto3";  //syntax关键词定义使用的是proto3语法版本

//定义消息体包名

package app.service.book;

// 单独为go定义包名

option go_package=".;book" ; // option关键字后面的 go_package 表示为go重新定义包名

//单独为php类文件配置命名空间

option php_namespace="./app/service/book";//php_namespace 表示生成php类文件配置命名空间

//单独为php元数据文件配置命名空间

option php_metadata_namespace="./app/service/book";//php_metadata_namespace 表示生成php元数据配置命名空间

//当然上面除了java和php外 还支持很多语言的特殊配置,有兴趣的可以百度查询

//生成消息体 -通常用作接口传参和返回值定义

message DataRequest { //message是关键字  DataRequest是消息名

        //[数据类型] [数据名称] = [数据标识号]  //标识号和数据名称不能重复

        int32   dataId32 = 1; //定义一个 int32 类型的数据,名称是 dataId32 标识号为1

        int64   dataId64 = 2; //定义一个 int64 类型的数据,名称是 dataId64 标识号为2

        string  dataName = 3;//下面的我就不一一说明,大致意思都是一样的

        bool    dataBool = 4;

        double dataDouble = 5;

        float    dataFloat = 6;

        DataType  type = 7 // DataType 是下面定义的枚举类型

        DataNew dataNew = 8;//DataNew 是下面定义的消息体

        map<string,string> dataMap = 9;//定义map类型的数据 map<key类型,value类型>

        repeated string dataNameList = 10;// repeated关键字 表示声明一个数组数据

        repeated DataNew dataNewList = 11;//repeated也可以用于消息体、map等

 }

//定义一个枚举消息类型 DataType

enum  DataType 

{

        hello = 0; //在proto3版本中,首成员必须为0,成员不应有相同的值

        word = 1;

}

//定义一个新消息体

message DataNew{

        int32 dataChildId = 1;

        string dataChildName = 2;

}

//除了定义消息外,proto还可以定义服务(rpc)

service dataService { //service关键字 用于定义一个服务

       [rpc 服务关键字] [方法名称](方法传参) [returns 关键字] [方法返回值]

        rpc  GetDataInfo(DataRequest ) returns (DataNew);

}

 上面记录了ProtoBuf文件的定义示例,至于通过protoc将.proto文件生成相应的代码,大家各自百度就行。

下面我简单的记录一下 php 在windows下的调用:

protoc.exe --php_out=./ --grpc_out=./  --plugin=protoc-gen-grpc=E:\\grpc_php_plugin.exe ./book.proto

--php_out=   //指定php文件生成的路径

--grpc_out= //如果需要通过php调用grpc 则需要指定生成php_grpc的文件路径

--plugin=protoc-gen-grpc=  //指定生成grpc文件对应的插件,大家可以上百度查找

如果大家是windows版本,且不会打包grpc_php_plugin.exe文件的话,我给提供一个大佬打包好的地址:

GitHub - lifenglsf/grpc_for_windows: grpc windows protobuf

如果命令运行过程中报缺少VCRUNTIME140_1.dll,MSVCP140.dll 等文件的话,在电脑上装个visual Studio 软件选中 C++桌面开发模块即可。

二、Gorm

Gorm定义:GORM是Golang目前比较热门的数据库ORM操作库,对开发者也比较友好,使用非常方便简单,使用上主要就是把struct类型和数据库表记录进行映射

Gorm示例:

首先通过go命令 安装mysql和Gorm相关驱动包

//安装MySQL驱动

go get -u gorm.io/driver/mysql

//安装gorm包

go get -u gorm.io/gorm

安装完驱动后,则开始连接sql 和 进行 sql 语句执行

package main   //定义包名

//引入相应包

import (

        "gorm.io/driver/mysql"  //引入mysql驱动包

        "gorm.io/gorm"             //引入gorm驱动包

        "fmt"                             //引入fmt包

        "time"                           //引入time包

        "errors"                        //引入errors包

)

//定义User模型,绑定users表,ORM库操作数据库,需要定义一个struct类型和MYSQL表进行绑定或者叫映射,struct字段和MYSQL表字段一一对应

//在这里User类型可以代表mysql users表

type User struct {

        ID int64 // 主键

        //`gorm:"column:username"` 标签说明含义是: Mysql表的列名(字段名)为username

        Username string `gorm:"column:username"`

        Password string `gorm:"column:password"` //注意设定gorm:"column:" 后 mysql映射的列就只和column指定的字符串有关,和前面的变量名无关。

        //创建时间,时间戳

        CreateTime int64 `gorm:"column:createtime"`

}

//设置表名,可以通过给struct类型定义 TableName函数,返回当前struct绑定的mysql表名是什么

func (u User) TableName() string {

        return "users"    //绑定MYSQL表名为users

}

func main() {

        //配置MySQL连接参数

        username := "root"    //账号

        password := "123456"  //密码

        host := "127.0.0.1" //数据库地址,可以是Ip或者域名

        port := 3306  //数据库端口

        Dbname := "test" //数据库名

        

        //通过前面的数据库参数,拼接MYSQL DSN, 其实就是数据库连接串(数据源名称)

        //MYSQL dsn格式: {username}:{password}@tcp({host}:{port})/{Dbname}?charset=utf8&parseTime=True&loc=Local

        //类似{username}使用花括号包着的名字都是需要替换的参数

        dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)

        //连接MYSQL

        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

        //err 用来接收gorm连接失败信息,连接成功则为nil

        if err != nil { panic("连接数据库失败, error=" + err.Error()) }

        //定义一个用户,并初始化数据

        u := User{

                Username:"tizi365",

                Password:"123456",

                CreateTime:time.Now().Unix(),

         }

        //下面代码会自动生成SQL语句:INSERT INTO `users` (`username`,`password`,`createtime`) VALUES ('tizi365','123456','1540824823')

        if err := db.Create(&u).Error; err != nil {

                fmt.Println("插入失败", err)

                 return

        }

 上面只列举了gorm针对于mysql的inster使用方法,如果想看其他的搜gorm的中文文档即可。

文档借鉴地址:golang基础教程 - 梯子教程网

三、Go-Redis

Redis示例

安装redis依赖包

go get -u github.com/go-redis/redis

 安装完redis后,进行redis连接调用

package mainimport ("fmt""github.com/go-redis/redis"
)func main() {client := redis.NewClient(&redis.Options{Addr:     "127.0.0.1:6379", // redis地址Password: "",               // redis密码,没有则留空DB:       0,                // 默认数据库,默认是0})// 设置一个key,过期时间为0,意思就是永远不过期err := client.Set("key", "value", 0).Err()// 检测设置是否成功if err != nil {panic(err)}// 根据key查询缓存,通过Result函数返回两个值//  第一个代表key的值,第二个代表查询错误信息val, err := client.Get("key").Result()// 检测,查询是否出错if err != nil {panic(err)}fmt.Println("key", val)/**Set - 设置一个key的值Get - 查询key的值GetSet - 设置一个key的值,并返回这个key的旧值SetNX - 如果key不存在,则设置这个key的值MGet - 批量查询key的值MSet - 批量设置key的值Incr,IncrBy,IncrByFloat - 针对一个key的数值进行递增操作Decr,DecrBy - 针对一个key的数值进行递减操作Del - 删除key操作,可以批量删除Expire - 设置key的过期时间HSet - 根据key和field字段设置,field字段的值HGet - 根据key和field字段,查询field字段的值HGetAll - 根据key查询所有字段和值HIncrBy - 根据key和field字段,累加数值。HKeys - 根据key返回所有字段名HLen - 根据key,查询hash的字段数量HMGet - 根据key和多个字段名,批量查询多个hash字段值HMSet - 根据key和多个字段名和字段值,批量设置hash字段值HSetNX - 如果field字段不存在,则设置hash字段值HDel - 根据key和字段名,删除hash字段,支持批量删除hash字段HExists - 检测hash字段名是否存在。LPush - 从列表左边插入数据LPushX - 跟LPush的区别是,仅当列表存在的时候才插入数据RPop - 从列表的右边删除第一个数据,并返回删除的数据RPush - 从列表右边插入数据RPushX - 跟RPush的区别是,仅当列表存在的时候才插入数据LPop - 从列表左边删除第一个数据,并返回删除的数据LLen - 返回列表的大小LRange - 返回列表的一个范围内的数据,也可以返回全部数据LRem - 删除列表中的数据LIndex - 根据索引坐标,查询列表中的数据LInsert - 在指定位置插入数据SAdd - 添加集合元素SCard - 获取集合元素个数SIsMember - 判断元素是否在集合中SMembers - 获取集合中所有的元素SRem - 删除集合元素SPop,SPopN - 随机返回集合中的元素,并且删除返回的元素ZAdd - 添加一个或者多个元素到集合,如果元素已经存在则更新分数ZCard - 返回集合元素个数ZCount - 统计某个分数范围内的元素个数ZIncrBy - 增加元素的分数ZRange,ZRevRange - 返回集合中某个索引范围的元素,根据分数从小到大排序ZRangeByScore,ZRevRangeByScore - 根据分数范围返回集合元素,元素根据分数从小到大排序,支持分页。ZRem - 删除集合元素ZRemRangeByRank - 根据索引范围删除元素ZRemRangeByScore - 根据分数范围删除元素ZScore - 查询元素对应的分数ZRank, ZRevRank - 查询元素的排名*/
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端开发攻略---合并表格单元格,表格内嵌套表格实现手风琴效果。

1、演示 2、思路 1、用传统的 <table></table> 表格标签来实现比较麻烦。因此通过模拟 表格标签 的写法用<div></div>来实现 2、表头和表格列数是相同的&#xff0c;因此可以确定代码结构 <div class"table"><div class"head…

PotPlayer 图像截取

PotPlayer 图像截取 1. PotPlayer2. PotPlayer 下载2.1. PotPlayer 240305 3. 图像截取References 1. PotPlayer http://www.potplayercn.com/ PotPlayer 是 KMPlayer 原作者姜勇囍进入新公司 Daum 之后推出的&#xff0c;继承了 KMPlayer 所有的优点&#xff0c;拥有异常强大…

Rust常见陷阱 | 算术溢出导致的 panic

Rust作为一种内存安全性语言,对于算术运算中的溢出处理特别严格。由于Rust默认会在debug模式下进行算术操作的溢出检查,任何溢出行为都会导致panic,这样能够帮助开发者在调试阶段发现潜在的溢出错误。尽管在release模式下,溢出会导致值的截断,并不会引起panic,但忽视这一…

Flask项目在Pycharm中设置局域网访问

打开PyCharm导入本应用。点击Run标签中的Edit Configurations 其中Target type选择Script path&#xff0c;Target填入本项目中app.py的路径&#xff0c;Additional optional填入--host0.0.0.0(不要有空格)。 再重新运行项目&#xff0c;会观察到除了原本的http://127.0.0.1:50…

【EI会议征稿通知】2024年图像处理、机器学习与模式识别国际学术会议(IPMLP 2024)

2024年图像处理、机器学习与模式识别国际学术会议&#xff08;IPMLP 2024) 2024 International Conference on Image Processing, Machine Learning and Pattern Recognition 重要信息 大会官网&#xff1a;www.ipmlp.net&#xff08;点击参会/投稿/了解会议详情&#xff09;…

用虚拟机搭建sqlmap靶机环境

要使用Virtual Machine (VM)搭建一个SQLMap靶机&#xff0c;您可以按照以下步骤进行&#xff1a; 第一步&#xff1a;准备虚拟机 选择虚拟化软件&#xff1a;您可以使用如VirtualBox、VMware Workstation等虚拟化软件来创建虚拟机。 创建虚拟机&#xff1a;在虚拟化软件中创建…

【赛题】2024年“华中杯”数模竞赛赛题发布

2024年"华中杯"数学建模网络挑战赛——正式开赛&#xff01;&#xff01;&#xff01; 赛题已发布&#xff0c;后续无偿分享各题的解题思路、参考文献&#xff0c;帮助大家最快时间&#xff0c;选择最适合是自己的赛题。祝大家都能取得一个好成绩&#xff0c;加油&a…

vue2指令

vue2指令 v-model 的工作原理&#xff0c;它如何在表单输入和应用状态之间创建双向绑定 v-model 是 Vue 中一个特殊的指令&#xff0c;用于在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。它根据控件类型自动选取正确的方法来更新元素。…

uiautomation、pytest、schedule实现桌面程序自动化(初级)02

一&#xff1a;安装uiAutomation 前置条件:安装python、pycharm 命令行安装 Pip install uiautomation2.0.17 #指定版本 二&#xff1a;安装辅助工具&#xff1a;inspect.exe和、Accessibility Insights For Windows定位元素工具 辅助工具介绍 步骤中提到…

Hive进阶(4)----MapReduce的计算过程(赋图助君理解)

MapReduce的计算过程 MapReduce是一种编程模型和处理大规模数据集的方法。它通常用于分布式计算环境中&#xff0c;能够将数据处理任务分解成独立的部分&#xff0c;分配给多台计算机进行并行处理。这个模型由Google提出&#xff0c;并在开源领域中得到了广泛的应用和实现。Map…

无法连接到MongoDB Atlas 的Cloud Database

打开Mongodb网页: 选择允许任何地址连接 连接成功

Docker容器嵌入式开发:在Ubuntu上配置RStudio与R语言、可视化操作

目录 一、dirmngr工具二、R环境安装与配置三、验证是否安装成功四、安装Rstudio五、可视化操作参考 以上是在Ubuntu 18.04上安装最新版本的R语言环境的步骤摘要。首先&#xff0c;通过添加CRAN镜像源并安装GPG密钥来配置软件源。然后&#xff0c;更新软件包列表并通过apt安装R语…

Ubuntu22.04.4 - vim - 笔记

一、编辑模式 1、进入 进入编辑模式: i 2、退出 退出编辑模式: Esc 二、命令行模式 1、进入 进入命令行&#xff0c;在退出编辑模式的情况下: : :wq 保存并退出、:q 不保存退出、 :q! 不保存强制退出 2、退出 退出编辑模式: Esc

SQL --索引

索引 INDEX 伪列 伪装起来的列&#xff0c;不容易被看见&#xff0c;要特意查询才能看见 ROWNUM&#xff1a; 是对查询结果自动生成的一组连续的自然数序号。 SELECT emp.*,ROWNUM FROM emp例题&#xff1a;查询emp表中&#xff0c;前三个员工 SELECT * FROM * from emp w…

【创建型模式】建造者模式

一、建造者模式概述 建造者模式定义&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同得表示。(对象创建型模式)。 建造者模式分析&#xff1a; 1.将客户端与包含多个部件得复杂对象得创建过程分离&#xff0c;客户端无需知道复杂对象…

微软面试高频算法题解析与代码实现(C++)

作为全球顶尖科技公司&#xff0c;微软对人才的招聘要求十分严格&#xff0c;尤其是在算法工程师的选拔上。算法面试是微软招聘流程中不可或缺的一环&#xff0c;考察候选人对算法和数据结构的理解和应用能力。本文将列举微软面试中出现频率较高的 10 道算法题&#xff0c;并使…

【unity】【C#】游戏音乐播放和发布

今天我们来认识一下有关 unity 音乐的一些知识 我们先创建 AudioClips 文件夹&#xff0c;这个文件夹通常就是 unity 中存放音乐的文件夹&#xff0c;然后拖进音乐文件进去 这里为大家提供了两个音乐&#xff0c;有需要可以自取 百度网盘&#xff1a;https://pan.baidu.com/s…

RIP最短路实验(华为)

思科设备参考&#xff1a;RIP最短路实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的内部网关协议&#xff0c;工作原理是每个路由器周期性地向邻居路由器发…

React Ant Design 简单实现如何选中图片

效果&#xff1a; 代码&#xff1a; 定义的初始值和方法 const [selected, setSelected] useState(0); // 表示当前选中的图片索引const handleClick (index) > {if (selected index) {setSelected(null); // 如果点击的是已选中的图片&#xff0c;则取消选中状态} else…

tcp inflight 守恒算法(tcp_ccr)

最初的算法&#xff1a; 在 winmax 中追踪 alpha rounds 的 bw / rtt&#xff0c;将其 bw 记为 b&#xff1b;在 winmin 中追踪 k*alpha rounds 的 rtt&#xff0c;记为 minrtt&#xff1b;保持 inflight b * minrtt beta。 后来我给 beta 增加了一个 rtt 缩放系数&#xf…