07 2019 档案
摘要:一、cookie技术 1、基本原理:允许 服务器端程序(PHP) 在 浏览器上存储数据 的一种技术。在浏览器向该服务器发出请求时,会携带该服务器所存储的数据。 2、cookie详解: 设置cookie函数:function setcookie ($name, $value = "", $expire
阅读全文
摘要:PDO是别人写的“数据库操作工具类”! 一、PDO连接Mysql数据库 $DSN = "mysql:host=服务器地址/名称;port=端口号;dbname=数据库名"; $Opt = array(PDO::MYSQL_ATTR_INIT_COMMAND=>’set names 连接编码’); $
阅读全文
摘要:一、Mysql数据库的操作命令 1、登录:mysql -h 服务器地址 -u 登录名 -p 密码 2、数据库备份:mysqldump -h 服务器地址 -p 数据库名 > 文件名 3、数据恢复:mysql -h服务器地址 -u登录名 -p 数据库名 < 文件名 4、创建数据库:create data
阅读全文
摘要:一、下载 https://pan.baidu.com/s/1NEL4tkHoK4ydqdMi_hgWcw 提取码:vx7e 二、Demo示例 三、插件文档
阅读全文
摘要:一、下载 https://github.com/zenorocha/clipboard.js/archive/master.zip 二、Demo示例 三、第三方Demo地址 http://www.webkaka.com/Blog/ARCHIVES/demo/clipboard.js-master/d
阅读全文
摘要:package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { //打开数据库 db, err := sql.Open("mysql", "root:root@(127.0.0.1:3306)/test") if err...
阅读全文
摘要:运行: 结果: 页数过多会比较慢,在第二次网络请求时可以创建协程解决,有代码优化的可以评论。
阅读全文
摘要:package main import ( "fmt" "net/http" "os" "strconv" ) var url = "https://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F&ie=utf-8&pn=" //get请求获取网页内容 func HttpGet(url st...
阅读全文
摘要:package main import ( "fmt" "io" "net/http" ) func main() { //发送get请求 resp, err := http.Get("http://www.baidu.com") if err != nil { fmt.Println(err.Error()) } ...
阅读全文
摘要:package main import ( "net/http" ) func myHandler(response http.ResponseWriter, request *http.Request) { response.Write([]byte("hello world")) } func main() { //注册一个处理器函数handler和对应的模式p...
阅读全文
摘要:服务端实现流程大致如下: 客户端实现流程大致如下:
阅读全文
摘要:TCP UDP 面向连接 面向无连接 要求系统资源较多 要求系统资源较少 TCP程序结构较复杂 UDP程序结构较简单 使用流式 使用数据包式 保证数据准确性 不保证数据准确性 保证数据顺序 不保证数据顺序 通讯速度较慢 通讯速度较快 TCP UDP 面向连接 面向无连接 要求系统资源较多 要求系统资
阅读全文
摘要:所谓四次挥手(Four-Way-Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务器任一方执行close来触发。好比两个人打完电话要挂断: Client:“我要说的事情都说完了,我没事了。挂啦
阅读全文
摘要:所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。好比两个人在打电话: Client:“喂,你听得到吗?” Server:“我听得到,你听得到我吗?” Client:“我能听到你,今天balabala
阅读全文
摘要:服务端: Listen函数: func Listen(network, address string) (Listener, error) network:选用的协议:TCP、UDP, 如:“tcp”或 “udp” address:IP地址+端口号, 如:“127.0.0.1:8000”或 “:80
阅读全文
摘要:我们希望当仓库满时,生产者停止生产,等待消费者消费;同理,如果仓库空了,我们希望消费者停下来等待生产者生产。为了达到这个目的,这里引入条件变量。(需要注意:如果仓库队列用channel,是不存在以上情况的,因为channel被填满后就阻塞了,或者channel中没有数据也会阻塞)。 条件变量的作用并
阅读全文
摘要:互斥锁的本质是当一个goroutine访问的时候,其他goroutine都不能访问。这样在资源同步,避免竞争的同时也降低了程序的并发性能。程序由原来的并行执行变成了串行执行。 其实,当我们对一个不会变化的数据只做“读”操作的话,是不存在资源竞争的问题的。因为数据是不变的,不管怎么读取,多少gorou
阅读全文
摘要:互斥锁是传统并发编程对共享资源进行访问控制的主要手段,它由标准库sync中的Mutex结构体类型表示。sync.Mutex类型只有两个公开的指针方法,Lock和Unlock。Lock锁定当前的共享资源,Unlock进行解锁。 在使用互斥锁时,一定要注意:对资源操作完成后,一定要解锁,否则会出现流程执
阅读全文
摘要:上面例子中把创建协程放在发送通道数据前可以正常运行。 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。
阅读全文
摘要:Go里面提供了一个关键字select,通过select可以监听channel上的数据流动。 select的用法与switch语言非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。 与switch语句相比, select有比较多的限制,其中最大的一条限制就是每个case语句
阅读全文
摘要:Ticker是一个周期触发定时的计时器,它会按照一个时间间隔往channel发送系统当前时间,而channel的接收者可以以固定的时间间隔从channel中读取事件。 相关函数:
阅读全文
摘要:一、单向通道 单向channel变量的声明非常简单,如下: var ch1 chan int // ch1是一个正常的channel,是双向的 var ch2 chan<- float64 // ch2是单向channel,只用于写float64数据 var ch3 <-chan int // ch
阅读全文
摘要:如果发送者知道,没有更多的值需要发送到channel的话,那么让接收者也能及时知道没有多余的值可接收将是有用的,因为接收者可以停止不必要的接收等待。这可以通过内置的close函数来关闭channel实现。 注意: l channel不像文件一样需要经常去关闭,只有当你确实没有任何发送数据了,或者你想
阅读全文
摘要:l 在第 1 步,右侧的 goroutine 正在从通道接收一个值。 l 在第 2 步,右侧的这个 goroutine独立完成了接收值的动作,而左侧的 goroutine 正在发送一个新值到通道里。 l 在第 3 步,左侧的goroutine 还在向通道发送新值,而右侧的 goroutine 正在从
阅读全文
摘要:无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。 这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作。否则,通道会导致先执行发送或接收操作的 goroutine 阻塞等待。 这种对通道进行发送和接收的交互行为本
阅读全文
摘要:和map类似,channel也一个对应make创建的底层数据结构的引用。 当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者和被调用者将引用同一个channel对象。和其它的引用类型一样,channel的零值也是nil。 定义一个channel时,也需
阅读全文
摘要:在第一次执行runtime.GOMAXPROCS(1) 时,最多同时只能有一个goroutine被执行。所以会打印很多1。过了一段时间后,GO调度器会将其置为休眠,并唤醒另一个goroutine,这时候就开始打印很多0了,在打印的时候,goroutine是被调度到操作系统线程上的。 在第二次执行ru
阅读全文
摘要:调用 runtime.Goexit() 将立即终止当前 goroutine 执⾏,调度器确保所有已注册 defer延迟调用被执行。
阅读全文
摘要:主协程进入main()函数,进行代码的执行。当执行到go func()匿名函数时,创建一个新的协程,开始执行匿名函数中的代码,主协程继续向下执行,执行到runtime.Gosched( )时会暂停向下执行,直到其它协程执行完后,再回到该位置,主协程继续向下执行。
阅读全文
摘要:主goroutine退出后,其它的工作goroutine也会自动退出
阅读全文
摘要:只需在函数调⽤语句前添加 go 关键字,就可创建并发执⾏单元。开发⼈员无需了解任何执⾏细节,调度器会自动将其安排到合适的系统线程上执行。
阅读全文
摘要:goroutine是Go并行设计的核心。goroutine说到底其实就是协程,它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为
阅读全文
摘要:Go 在语言级别支持协程,叫goroutine。Go 语言标准库提供的所有系统调用操作(包括所有同步IO操作),都会出让CPU给其他goroutine。这让轻量级线程的切换管理不依赖于系统的线程和进程,也不需要依赖于CPU的核心数量。 Go语言中的并发程序主要使用两种手段来实现。goroutine和
阅读全文
摘要:协程:coroutine。也叫轻量级线程。 与传统的系统级线程和进程相比,协程最大的优势在于“轻量级”。可以轻松创建上万个而不会导致系统资源衰竭。而线程和进程通常很难超过1万个。这也是协程别称“轻量级线程”的原因。 一个线程中可以有任意多个协程,但某一时刻只能有一个协程在运行,多个协程分享该线程分配
阅读全文
摘要:一、互斥锁mutex 每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。资源还是共享的,线程间也还是竞争的,但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。 但,应注意:同一时刻,只能有一个线程持有该锁。 二、读写锁 与互斥量类似,但读写锁允许更高的并行
阅读全文
摘要:线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。 “同步”的目的,是为了避免数据混乱,解决与时间有关的错误。实际上,不仅线程间需要同步,进程间、信号间等等都需要同步机制。
阅读全文
摘要:一、程序与进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、设备、锁....) 进程,是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来,产生一个进程) 二、进程状态 进程基本的状态有5种。分别为初始态,就绪态
阅读全文
摘要:并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,通过cpu时间片轮转使多个进程快速交替
阅读全文
摘要:1.从用户给出的目录中,找出所有的 .jpg 文件。 2.从用户给出的目录中,拷贝 .mp3文件到指定目录中。
阅读全文
摘要:将当前工作目录修改为dir指定的目录: func Chdir(dir string) error 返回当前工作目录的绝对路径: func Getwd() (dir string, err error) 使用指定的权限和名称创建一个目录: func Mkdir(name string, perm Fi
阅读全文
摘要:func (f *File) Readdir(n int) ([]FileInfo, error) 参数:n,表读取目录的成员个数。通常传-1,表读取目录所有文件对象。 返回值:FileInfo类型的切片。其内部保存了文件名。error中保存错误信息。 type FileInfo interface
阅读全文
摘要:打开目录我们也使用 OpenFile 函数,但要指定不同的参数来通知系统,要打开的是一个目录文件。 func OpenFile(name string, flag int, perm FileMode) (*File, error) 参数1:name,表示要打开的目录名称。使用绝对路径较多 参数2:
阅读全文
摘要:package main import ( "fmt" ) type Student struct { id int name string } //结构体传值是值传递 func InitData(s *Student) { s.id = 1 s.name = "yang" } func main() { var s Student ...
阅读全文
摘要:package main import ( "fmt" ) func main() { var arr [3]int = [3]int{1, 2, 3} //将数组地址赋值给p p := &arr for _, v := range *p { fmt.Println(v) } }
阅读全文
摘要:指针数组指的是一个数组中存储的都是指针(也就是地址)。也就是一个存储了地址的数组。 指针数组的定义方式,与数组指针定义方式是不一样的,注意指针数组是将“*”放在了下标的后面。 由于指针数组存储的都是地址,所以将变量i,与变量j的地址赋值给了指针数组p。 最后输出指针数组p中存储的地址。
阅读全文
摘要:package main import ( "fmt" ) func swap01(a, b int) { a, b = b, a fmt.Printf("swap01 a = %d, b = %d\n", a, b) } func swap02(x, y *int) { *x, *y = *y, *x } func main() { a := 1...
阅读全文
摘要:表达式new(T)将创建一个T类型的匿名变量,所做的是为T类型的新值分配并清零一块内存空间,然后将这块内存空间的地址作为结果返回,而这个结果就是指向这个新的T类型值的指针值,返回的指针类型为*T。 new创建的内存空间位于heap上,空间的默认值为数据类型默认值。如:new(int) 则 *p为0,
阅读全文
摘要:package main import ( "fmt" ) func main() { var a int = 10 //每个变量都有两层含义,变量的内存和变量的地址 fmt.Printf("a = %d\n", a) //变量的内存 10 fmt.Printf("a = %v\n", &a) //变量的地址 0xc042060080 //...
阅读全文
摘要:结构体作为函数参数进行传递,是值传递。
阅读全文
摘要:package main import ( "fmt" ) type Student struct { id int name string score float64 } func main() { s := []Student{ Student{ 1, "yy", ...
阅读全文
摘要:两个结构体可以使用 == 或 != 运算符进行比较,但不支持 > 或 <。 同类型的两个结构体变量可以相互赋值。
阅读全文
摘要:注意:顺序初始化,每个成员必须初始化,在初始化时,值的顺序与结构体成员的顺序保持一致。
阅读全文
摘要:package main import ( "fmt" ) func InitData(s []int) { for i := 0; i < len(s); i++ { s[i] = i } } //切片作为函数参数是引用传递 func main() { s := make([]int, 10) InitData(s) fmt...
阅读全文
摘要:函数 copy 在两个 slice 间复制数据,复制⻓度以 len 小的为准,两个 slice 指向同⼀底层数组。直接对应位置覆盖。
阅读全文
摘要:append() 函数可以向 slice 尾部添加数据,可以自动为切片扩容。常常会返回新的 slice 对象。 append函数会智能的将底层数组的容量增长,一旦超过原底层数组容量,通常以2倍(1024以下)容量重新分配底层数组,并复制原来的数据。因此,使用append 给切片做扩充时,切片的地址可
阅读全文
摘要:操作 含义 s[n] 切片s中索引位置为n的项 s[:] 从切片s的索引位置0到len(s)-1处所获得的切片 s[low:] 从切片s的索引位置low到len(s)-1处所获得的切片 s[:high] 从切片s的索引位置0到high处所获得的切片,len=high s[low:high] 从切片s
阅读全文
摘要:package main import ( "fmt" ) func main() { //方式一 var s []int = []int{1, 2, 3} fmt.Println(s) //方式二 s1 := []string{"a", "b", "c"} fmt.Println(s1) //方式三 s2 := m...
阅读全文
摘要://1.切片时指针类型,数组是值类型 //2.数组的长度是固定的,而切片不是(切片是动态的数组) //3.切片比数组多一个属性:容量(cap) //4.切片的底层是数组
阅读全文
摘要:package main import ( "fmt" ) //注意:数组长度小于容量时,会自动填充 func main() { //方式一 var iArr [5]int = [5]int{1, 2, 3, 4} fmt.Println(iArr) //[1 2 3 4 0] var sArr [3]string = [3]string{"a"}...
阅读全文
摘要:package main import ( "fmt" ) //数组传值是值传递,切片是引用传递 func UpdateArr(b [3]string) { b[0] = "c" fmt.Println(b) } func UpdateArr2(b *[3]string) { (*b)[0] = "c" } func main() { b := [...
阅读全文
摘要:package main import ( "fmt" ) func main() { var arr [10]int = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0} var temp int for i := 0; i arr[j+1] { temp = arr[j] ...
阅读全文
摘要:package main import ( "fmt" ) //数组倒序函数 func Reverse(arr *[3]string, length int) { var temp string for i := 0; i < length/2; i++ { temp = (*arr)[i] (*arr)[i] = (*arr)[len...
阅读全文
摘要:package main import ( "fmt" "strconv" ) func main() { /*****Format系列******/ // bool转字符串 fmt.Println(strconv.FormatBool(true)) //'f'指打印格式以小数方式,3:指小数位数, 64:指float64处理 fmt....
阅读全文
摘要:package main import ( "fmt" "strings" ) func main() { var s string = "hello go" //判断字符串s是否包含子串 r := strings.Contains(s, "go") fmt.Println(r) //true var s1 []string = []...
阅读全文
摘要:(1) 让用户输入要拷贝的文件的名称(源文件)以及目的文件的名称 (2) 创建目的文件 (3) 打开源文件,并且读取该文件中的内容 (4) 将从源文件中读取的内容写到目的文件中。
阅读全文
摘要:package main import ( "bufio" "fmt" "io" "os" ) func main() { f, err := os.Open("a.txt") if err != nil { fmt.Println(err.Error()) } //建立缓冲区,把文件内容放到缓冲区中 b...
阅读全文
摘要:package main import ( "fmt" "io" "os" ) func main() { f, err := os.Open("a.txt") if err != nil { fmt.Println(err.Error()) } //关闭文件 defer f.Close() //Read...
阅读全文
摘要:package main import ( "fmt" "os" ) func CreateFile(file_name string) { //创建文件 f, err := os.Create("a.txt") //判断是否出错 if err != nil { fmt.Println(err) } // n:写...
阅读全文
摘要:package main import ( "fmt" "os" ) func CreateFile(file_name string) { //创建文件 f, err := os.Create("a.txt") //判断是否出错 if err != nil { fmt.Println(err) } //打印文件...
阅读全文