11 2021 档案

摘要:strconv 包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi()、Itia()、parse系列、format系列、append系列。 string与int类型转换 这一组函数是我们平时编程中用的最多的。 Atoi() Atoi()函数用于将字符串类型的整 阅读全文
posted @ 2021-11-30 17:44 专职 阅读(251) 评论(0) 推荐(0) 编辑
摘要:bufio bufio包实现了带缓冲区的读写,是对文件读写的封装 bufio缓冲写数据 模式 含义 os.O_WRONLY 只写 os.O_CREATE 创建文件 os.O_RDONLY 只读 os.O_RDWR 读写 os.O_TRUNC 清空 os.O_APPEND 追加 bufio读、写数据 阅读全文
posted @ 2021-11-30 16:07 专职 阅读(441) 评论(0) 推荐(0) 编辑
摘要:参考链接 输入输出的底层原理 终端其实是一个文件,相关实例如下: os.Stdin:标准输入的文件实例,类型为*File os.Stdout:标准输出的文件实例,类型为*File os.Stderr:标准错误输出的文件实例,类型为*File 以文件的方式操作终端: func main() { var 阅读全文
posted @ 2021-11-30 14:54 专职 阅读(198) 评论(0) 推荐(0) 编辑
摘要:Go语言内置的log包实现了简单的日志服务。本文介绍了标准库log的基本使用。 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列 阅读全文
posted @ 2021-11-29 17:08 专职 阅读(106) 评论(0) 推荐(0) 编辑
摘要:Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。 os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数。 func main() { // 获取命令行参数 // os.Args:[]string if l 阅读全文
posted @ 2021-11-29 14:29 专职 阅读(189) 评论(0) 推荐(0) 编辑
摘要:时间类型 time.Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。示例代码如下: func main() { current := time.Now() fmt.Println(current) // 2021-11-26 16: 阅读全文
posted @ 2021-11-29 10:41 专职 阅读(282) 评论(0) 推荐(0) 编辑
摘要:一行代码搞定 code := fmt.Sprintf("%06v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000)) fmt.Println(code) 阅读全文
posted @ 2021-11-27 18:01 专职 阅读(427) 评论(0) 推荐(0) 编辑
摘要:fmp fmt.Fprintln、fmt.Fprintf fmt.Fprintln(os.Stdout, "向标准输出写入内容") // 0644: 拥有者6读写权限,组用户4读权限,其它用户4读权限 // os.O_CREATE创建权限,os.O_WRONLY只写权限,os.APPEND追加权限, 阅读全文
posted @ 2021-11-26 15:39 专职 阅读(210) 评论(0) 推荐(0) 编辑
摘要:用户表(前台、后台) type User struct { ID int `gorm:"primaryKey;autoIncrement"` Name sql.NullString `gorm:"default:'隔壁老王'"` Age uint8 `gorm:"default:55"` UUID 阅读全文
posted @ 2021-11-26 10:25 专职 阅读(2871) 评论(0) 推荐(0) 编辑
摘要:作用域允许您重用常用逻辑,共享逻辑需要定义为类型 func(*gorm.DB) *gorm.DB 查询 func Scope1(db *gorm.DB) *gorm.DB { return db.Where("name = ?", "哈哈哈") } func Scope2(slice1 []int) 阅读全文
posted @ 2021-11-25 17:38 专职 阅读(1570) 评论(0) 推荐(0) 编辑
摘要:包含mysql配置、gorm配置、连接池配置、log日志配置 init_db_log.go文件代码 package main import ( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "time" ) con 阅读全文
posted @ 2021-11-25 13:41 专职 阅读(1078) 评论(0) 推荐(0) 编辑
摘要:删除 删除一条记录 删除一条记录时,删除对象需要指定主键,否则会触发 批量 Delete,例如: db.Debug().Where("id = ?", 6).Delete(new(User)) // DELETE FROM `users` WHERE id = 6 db.Debug().Delete 阅读全文
posted @ 2021-11-22 15:43 专职 阅读(2253) 评论(0) 推荐(0) 编辑
摘要:package tool import ( "bufio" "encoding/json" "fmt" "os" ) type Config struct { AppName string `json:"app_name"` AppMode string `json:"app_mode"` AppH 阅读全文
posted @ 2021-11-21 18:42 专职 阅读(1112) 评论(0) 推荐(0) 编辑
摘要:核心知识点 json配置文件解析成结构体 将路由对应的接口抽离到单独的文件中,main函数中直接注册路由即可 项目目录图 项目代码 app.json代码 { "app_name": "cloudRestaurant", "app_mode": "debug", "app_host": "127.0. 阅读全文
posted @ 2021-11-21 18:36 专职 阅读(559) 评论(0) 推荐(0) 编辑
摘要:package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "log" ) func main() { // 链接数据库 //dsn := "username:password@protocal(host 阅读全文
posted @ 2021-11-21 15:33 专职 阅读(418) 评论(0) 推荐(0) 编辑
摘要:概念 一个完整的系统可能包括鉴权认证、权限管理、安全检查、日志记录等多维度的系统支持。 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加的方式不会影响编码的效率,也不会侵入到框架中。 中间件的位置和角色示意图 自定义一个中间件 gin中 阅读全文
posted @ 2021-11-21 12:08 专职 阅读(312) 评论(0) 推荐(0) 编辑
摘要:1. gin框架中可以使用路由组来实现对路由的分类 package main import "github.com/gin-gonic/gin" func main() { router := gin.Default() userGroup := router.Group("/user") user 阅读全文
posted @ 2021-11-21 10:08 专职 阅读(144) 评论(0) 推荐(0) 编辑
摘要:返回四种格式的数据:1. []byte、string 2. json格式 3. html模板渲染 4. 静态资源设置 package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { router := gin.D 阅读全文
posted @ 2021-11-20 20:38 专职 阅读(1189) 评论(0) 推荐(0) 编辑
摘要:package main import ( "fmt" "github.com/gin-gonic/gin" ) // gin框架提供给开发者表单实体绑定的功能,可以将表单数据与结构体绑定 type userRegister struct { UserName string `form:"usern 阅读全文
posted @ 2021-11-20 16:39 专职 阅读(631) 评论(0) 推荐(0) 编辑
摘要:1. 方法一: 通用的处理方法 Handle package main import ( "fmt" "github.com/gin-gonic/gin" "log" ) func main() { router := gin.Default() router.Handle("GET","/hell 阅读全文
posted @ 2021-11-20 14:56 专职 阅读(529) 评论(0) 推荐(0) 编辑
摘要:保存所有字段 Save 会保存所有的字段,即使字段是零值、 db.First(&user, 5)user.Name = sql.NullString{"王八", true}user.Age = 9db.Debug().Save(&user)// UPDATE `users` SET `name`=' 阅读全文
posted @ 2021-11-19 18:09 专职 阅读(1872) 评论(0) 推荐(0) 编辑
摘要:智能选择字段 GORM 允许通过 Select 方法选择特定的字段,如果您在应用程序中经常使用此功能,你也可以定义一个较小的结构体,以实现调用 API 时自动选择特定的字段,例如: type User struct { ID int `gorm:"primaryKey;autoIncrement"` 阅读全文
posted @ 2021-11-19 14:41 专职 阅读(2807) 评论(0) 推荐(0) 编辑
摘要:检索单个对象 GORM 提供了 First、Take、Last 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件 // 获取第一条记录(主键升序) db.First(&user) // SELECT * FROM `users` ORDER BY `users`.`id 阅读全文
posted @ 2021-11-18 14:29 专职 阅读(2622) 评论(0) 推荐(0) 编辑
摘要:1. 简单创建记录 user := User{Name: "李四", Age: 88, Birthday: time.Now()} ret := db.Create(&user) // 通过数据的指针来创建 fmt.Println(user.ID) // 返回插入数据的主键 fmt.Println( 阅读全文
posted @ 2021-11-16 19:19 专职 阅读(216) 评论(0) 推荐(0) 编辑
摘要:1. mysql的初始化配置 dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", user, passwd, host, port, db, other) //db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ 阅读全文
posted @ 2021-11-16 15:16 专职 阅读(2571) 评论(0) 推荐(0) 编辑
摘要:模型定义 模型是标准的结构体,由go的基本数据类型、实现了Scanner和Valuer接口的自定义类型及其指针或别名组成 例如: type User struct { ID uint Name string Email *string Age uint8 Birthday *time.Time Me 阅读全文
posted @ 2021-11-16 14:50 专职 阅读(264) 评论(0) 推荐(0) 编辑
摘要:特性 全功能 ORM 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承) Create,Save,Update,Delete,Find 中钩子方法 支持 Preload、Joins 的预加载 事务,嵌套事务,Save Point,Rollbac 阅读全文
posted @ 2021-11-16 10:52 专职 阅读(148) 评论(0) 推荐(0) 编辑
摘要:1. redis简单介绍 redis支持数据的持久化,将内存中的数据保存到磁盘中,重启的时候可以再次加载进行使用 redis不仅仅支持key-value数据,还支持:string,list,set,hash等 redis支持数据备份,即master-slaver模式的数据备份 读11w/s,写8W/ 阅读全文
posted @ 2021-11-12 17:37 专职 阅读(721) 评论(0) 推荐(0) 编辑
摘要:package main import ( "fmt" "reflect" ) func B2S(bs []uint8) string { // 将字节切片转换成字符串 ba := make([]byte, 0) // 创建一个字节切片,默认容量0 fmt.Println(ba, reflect.T 阅读全文
posted @ 2021-11-12 14:29 专职 阅读(2407) 评论(0) 推荐(0) 编辑
摘要:1. 安装mysql驱动库和sqlx基于官方sql库的扩展库 go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx 2. 链接mysql package main import ( "fmt" _ "github.c 阅读全文
posted @ 2021-11-11 17:06 专职 阅读(121) 评论(0) 推荐(0) 编辑
摘要:一、GMP模型原理first: 1. 全局队列:存放待运行的G2. P的本地队列:同全局队列类似,存放待运行的G,存储的数量有限:256个,当创建新的G‘时,G’优先加入到P的本地队列,如果队列已满,会把P本地队列中一半的G移动到全局队列3. M线程:M运行G需要先获取P,然后从P本地队列中取G运行 阅读全文
posted @ 2021-11-11 11:21 专职 阅读(350) 评论(0) 推荐(0) 编辑
摘要:1. 概念 原子操作 atomic 包 加锁操作涉及到内核态的上下文切换,比较耗时,代价高, 针对基本数据类型我们还可以使用原子操作来保证并发的安全, 因为原子操作是go语言提供的方法,我们在用户态就可以完成,因此性能比加锁操作更好 go语言的原子操作由内置的库 sync/atomic 完成2. a 阅读全文
posted @ 2021-11-10 10:57 专职 阅读(560) 评论(0) 推荐(0) 编辑
摘要:1. Go语言中可以使用sync.WaitGroup来实现并发任务的同步 package main import ( "fmt" "sync" ) func hello(wg *sync.WaitGroup) { defer wg.Done() fmt.Println("hello") } func 阅读全文
posted @ 2021-11-08 17:37 专职 阅读(644) 评论(0) 推荐(0) 编辑
摘要:1. 并发安全 package main import ( "fmt" "sync" ) var ( sum int wg sync.WaitGroup ) func test() { for i := 0; i < 5000000; i++ { sum += 1 } wg.Done() } fun 阅读全文
posted @ 2021-11-08 14:35 专职 阅读(112) 评论(0) 推荐(0) 编辑
摘要:1. timer 定时器,时间到了执行,只执行一次 package main import ( "fmt" "time" ) func main() { // 1. timer基本使用 /* timer1 := time.NewTimer(2 * time.Second) t := time.Now 阅读全文
posted @ 2021-11-08 11:07 专职 阅读(432) 评论(0) 推荐(0) 编辑
摘要:package main import ( "database/sql" "gorm.io/driver/mysql" "gorm.io/gorm" ) // 1. 定义模型 type User struct { ID int64 // ID默认被当做主键 //Name *string `gorm: 阅读全文
posted @ 2021-11-07 18:53 专职 阅读(2159) 评论(0) 推荐(0) 编辑
摘要:1. gorm操作mysql: 1.1 安装gorm gorm官网: https://gorm.io/zh_CN/docs/connecting_to_the_database.html gorm的github地址:https://github.com/go-gorm/gorm go get -u 阅读全文
posted @ 2021-11-07 17:10 专职 阅读(407) 评论(0) 推荐(0) 编辑
摘要:1. 概念本质上是生产者、消费者模型可以有效的控制goroutine数量,防止暴涨案例:生成一个随机数,计算该随机数每一个数字相加的和,例如:123:1+2+3=6主协程负责生产数据发送到待处理通道中去(发送的不仅仅是数据,而是包含数据的结构体指针)一个子协程负责监听结果通道,一旦有数据,取出来打印 阅读全文
posted @ 2021-11-05 19:52 专职 阅读(313) 评论(0) 推荐(0) 编辑
摘要:1. 概念 单纯的将函数并发执行是没有意义的,函数与函数之间需要交换数据才能提现并发执行函数的意义虽然可以使用共享内存来进行数据的交换,但是在共享内存在不同的goroutine中容易发生竟态问题,为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题,go语言的并发模型是C 阅读全文
posted @ 2021-11-04 17:10 专职 阅读(277) 评论(0) 推荐(0) 编辑
摘要:1. runtime.Gosched 让出CPU时间片,重新等待安排任务 package main import ( "fmt" "runtime" ) func main() { go func(s string) { for i :=0; i < 2; i++ { fmt.Println(s) 阅读全文
posted @ 2021-11-04 14:24 专职 阅读(372) 评论(0) 推荐(0) 编辑
摘要:1. 概念 goroutine 奉行通过通信来共享内存,而不是共享内存来通信 goroutine 是由go的运行时(runtime)调度和管理的 go程序会智能的将goroutine中的任务合理的分配给CPU执行 go语言之所以会被称为现代化编程语言,是因为它在语言层面已经内置了调度和上下文切换的机 阅读全文
posted @ 2021-11-04 11:15 专职 阅读(109) 评论(0) 推荐(0) 编辑
摘要:package main import ( "bytes" "fmt" "io" ) // 此处的w参数默认是一个空接口,当传递进来buf参数时,w就不是空接口了,因为它有类型了,但是动态值是一个空指针 nil func test(w io.Writer) { if w != nil { fmt.P 阅读全文
posted @ 2021-11-03 16:49 专职 阅读(93) 评论(0) 推荐(0) 编辑
摘要:package main import ( "fmt" ) type Sayer interface { say() } type Mover interface { move() } type Animal interface { // 接口与接口嵌套创造出新的接口,Animal接口有Sayer和 阅读全文
posted @ 2021-11-03 16:09 专职 阅读(337) 评论(0) 推荐(0) 编辑
摘要:总结: 1. 值类型的嵌入式字段,该类型拥有值类型的方法集,没有值指针类型的方法集 2. 指针类型的嵌入式字段,该类型拥有值指针类型的方法集,没有值类型的方法集,并且,该类型的指针类型也有值指针类型的方法集 有点绕,见案例: package main import "fmt" type Boss s 阅读全文
posted @ 2021-11-03 13:41 专职 阅读(288) 评论(0) 推荐(0) 编辑
摘要:1. http server package main import ( "fmt" "net/http" ) func main() { // 请求url和对应处理函数 http.HandleFunc("/hello", myHandleFunc) // 开启服务 http.ListenAndSe 阅读全文
posted @ 2021-11-01 16:35 专职 阅读(38) 评论(0) 推荐(0) 编辑
摘要:1. udp server package main import ( "fmt" "net" ) func main() { // udp server listenUdp, err := net.ListenUDP("udp", &net.UDPAddr{ IP: net.IPv4(127,0, 阅读全文
posted @ 2021-11-01 15:25 专职 阅读(681) 评论(0) 推荐(0) 编辑
摘要:1. tcp server package main import ( "bufio" "fmt" "net" ) func main() { // 1. 监听端口 listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil 阅读全文
posted @ 2021-11-01 14:05 专职 阅读(280) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示