基于IOC解决对象依赖问题
基于IOC解决对象依赖问题ioc是一种软件设计原则,用来降低代码之间耦合度。如果没有ioc机制,多个模块调用会显得异常繁琐,而ioc是将控制权从程序代码中抽离,交给外部的容器或框架,从而实现依赖关系的动态置顶,增加程序的灵活性和可维护性,下面我的例子只是一个简单的以容器为基础实现的ioc注册。
store.go:
IocContainer:负责注册ioc对象、初始化ioc对象操作
ackage ioc
import (
"fmt"
"gitee.com/dujie5416/vblog/apps/users/config"
"github.com/gin-gonic/gin"
)
//
// IocContainer
// @Description: 定义一个对象注册表
//
type IocContainer struct {
// 采用map来保证对象的注册关系
store map[string]IocObject
}
/*
* Init
* @Description: 负责初始化所有的对象,因为map是无 ...
Gin框架
Gin框架一、Gin框架使用1、Gin框架简介Gin是一个用Go语言编写的Web框架。Gin框架拥有很好的性能,借助高性能的HttpRouter包,运行速度得到了极大的提升。
2、Gin框架安装与示例(1)、安装
go get -u github.com/gin-gonic/gin
(2)、示例
func Get(c *gin.Context) {
name := c.Query("name") // 从url中获取name字段
// 返回字符串格式的数据
//c.String(200, "欢迎您:%s", name)
// c.JSON :返回JSON格式的数据
c.JSON(200, gin.H{
"code": http.StatusOK,
"msg": "返回信息",
"data": "欢迎您" + name,
})
}
func main() {
// 创建一个默认的路由引擎
r := gin.Default() ...
ServeMux、httprouter
ServeMux、httprouter一、创建一个简单的goWeb服务器func Hello(w http.ResponseWriter, r *http.Request) {
fmt.Println("1", r.RemoteAddr)
fmt.Println("2", r.Method)
fmt.Println("3", r.Host)
fmt.Println("4", r.URL)
w.Write([]byte("这是测试页面"))
}
func main() {
http.HandleFunc("/", Hello)
if err := http.ListenAndServe(":8080",nil);err!=nil{
log.Fatal(err)
}
上例代码,main()函数通过代码http.ListenAndServe(":8080",nil) 启动一个8080 端口的服务器。如果这个函数传入第一个参数(网络地址)为空,则 ...
Sync包实现并发
Sync包实现并发一、静态Go语言以构建高并发容易、性能优异而文明,但是随着并发的使用,可能发生数据争用的静态问题。由于不知道什么时候发生,所以讲产生难以发现和调试的错误。
例子:
func getNumber() int {
var i int
go func() {
i = 6
}()
return i
}
func main() {
fmt.Println(getNumber())
}
上例,getNumber() 函数先声明一个变量i,之后在goroutine中单独对i进行设置。而这时程序也正在从函数中返回i,由于不知道goroutine是否已经完成对i值的修改,所以将有两种操作发生:
如果goroutine已完成对i值的修改,则最后返回的i值为6;
如果goroutine未完成对i值的修改,则变量i的值从函数返回,为默认值0
现在根据这两个操作中的哪一个先完成,输出的记过将是0(默认整数值)或6。这就是为什么将其称为数据竟态:从getNumber() 函数返 ...
Go文件处理
Go文件处理一、操作目录Go语言对文件和目录操作,主要通过os包和path包实现。
1、创建目录Go语言创建目录,主要使用Mkdir() 、MkdirAll() 两个函数。其中Mkdir() 函数的定义如下:
func Mkdir(name string, perm FileMode) error {
}
其中,name是需要创建的目录名字,perm 为权限设置码。比如perm为0700,表示该目录对所有用户都可读写及可执行
例如,创建一个名为”test”的目录,perm权限为0700的示例如下:
package main
import (
"log"
"os"
)
func main(){
// 创建一个名为"test"的目录,权限为777
err := os.Mkdir("test", 777)
if err != nil {
log.Panicln(err)
}
}
MkdirAll()函数的定义如下:
func MkdirAll(path string, perm FileMode) ...
Channel通道
Channel通道通道的定义通道(channel)是用来传递数据的一个数据结构。go语言提倡使用通信来代替共享内存。当一个资源需要在goroutine之间共享时,通道在goroutine之间架起了一个管道,并提供了确保同步交换数据的机制。
在声明通道时,需要指定要被共享的数据的类型。可以通过通道共享内置类型、命名类型、结构类型和引用类型的值或指针。
Go语言中的通道在任何时候,同时只能有一个goroutine访问通到进行发送和接受数据。
Channel底层是一个先进先出的环形队列(固定大小环形数组实现)
full或empty就会阻塞
send发送
recv接受并移除
sendx表示最后一次插入的元素的index
recvx表示最后一次接受元素的index
发送、接受的操作符号都是<-
通道构造源码runtime/chan.go/makechan
nil通道var c1 chan int
fmt.Printf("c1: %d, %d, %v\n", len(c1), cap(c1), c1) // c1: 0, 0, <nil>
c1 <- ...
Golang协程
协程协程是一种比线程更加轻量级的一种函数,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。协程不是被操作系统内核管理的,而是完全由程序所控制的,即在用户态执行,这样的好处是,性能有大幅度的提升,因为不会像线程切换那样消耗资源。
协程不是进程也不是线程,而是一个特殊的函数。这个函数可以在某个地方被“挂起”,并且可以重新再挂起处继续运行
一个进程可以有多个线程,一个线程也可以有多个协程运行。在一个线程内可以有多个这样的特殊函数在运行,但是必须明确一点:一个线程中的多个协程的运行是串行的。如果是多核CPU,那多个进程或一个进程内的多个线程是可以并行运行的。但是在一个线程内的多个协程之间运行绝对是串行的,无论CPU有多少核。当一个协程被运行时,其他协程必须被挂起
进程、线程、协程对比
协程既不是进程也不是线程,协程仅是一个特殊的函数。协程、进程和线程不是一个维度的。
一个进程可以包含多个线程,一个线程可以包含多个协程。
虽然一个线程内的多个协程可以切换,但是这多个协程是串行执行的,某个时刻只能有一个线程在运行,没法利用CPU的多核能力。
协程与进程一样,也存在上下文切换问题
进 ...
TCP编程
TCP编程Socket编程Python中提供了socket标准库,非常底层的接口库。 Socket是一种通用的网络编程接口,和网络层次没有一一对应的关系。
协议族 AF表示Address Family,用于socket()第一个参数
名称
含义
AF_INET
IPV4
AF_INET6
IPV6
AF_UNIX
Unix Domain Socket,windows没有
Socket类型
名称
含义
SOCK_STREAM
面向连接的流套接字。默认值,TCP协议
SOCK_DGRAM
无连接的数据报文套接字。UDP协议
TCP协议是流协议,也就是一大段数据看做字节流,一段段持续发送这些字节。
UDP协议是数据报协议,每一份数据封在一个单独的数据报中,一份一份发送数据。
注意:一开始学习网络编程,不要陷入协议的细节中。
CS编程Socket编程,是完成一端和另一端通信的,注意一般来说这两端分别处在不同的进程中,也就是说网络通信是一个进程发消息到另外一个进程。
我们写代码的时候,每一个socket对象只表示了其中的一端。
从业务角度来说,这两端从角 ...
进程和线程
进程线程并发和并行并发Concurrency: 是指同一时刻在CPU中只能有一条指令执行,多个进程指令被快速的轮换执行。从宏观来看,是多个进程同时执行。但从微观来看,这些进程并不是同时执行的,只是吧时间分成若干段,多个进程快速交替的执行。
在操作系统中,进程的并发就是:CPU把一个时间段划分成几个时间片,进程在这几个时间区间之间来回切换处理的过程。CPU处理的速度非常快,只要时间间隔处理得当,就可以让用户感觉是多个进程同时在执行。如下图
并行parallelism:同一时刻有多条执行在多个处理器上同时执行。如果系统有一个以上CPU,当一个CPU在执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占cpu资源,可以同时进行。
决定进程并行的因素不是CPU数量,而是CPU的核心数。比如一个CPU多核也可以并行
进程和线程早期工作模式最早计算机很巨大笨重,得把程序转换成某种编码对应的纸带或卡片上的孔(类似2B铅笔涂答题卡),输入设备再读取打孔纸带把程序和数据装入计算机,程序在计算机上运行完,在通过打印机输出。整个过程一个程序从输入到输出在所有环节都是独占资源,实际上输入、输出 ...
Golang 操作MongoDB
MongoDBMongoDB属于非关系型数据库,是由C++编写的分布式文档数据库。内部使用类似于Json的bson二进制格式。
中文手册
https://www.w3cschool.cn/mongodb/
安装https://www.mongodb.com/try/download/community
自行下载对应操作系统的MongoDB,并运行它。
windows可以下载官方zip,解压即可使用。
组件
文件名
Server
mongod.exe
Router
mongos.exe,Query Router,Sharding Cluster
Client
mongo.exe
MonitoringTools
mongostat.exe,mongotop.exe
ImportExportTools
mongostat.exe,mongotop.exe
MiscellaneousTools
bsondump.exe,mongofiles.exe,mongooplog.exe,mongoperf.exe
运行$ cd /o/mongodb3.6/bin
$ ...