go
陌离
这个作者很懒,什么都没留下…
展开
-
openssl
CA(Certificate Authority):颁发数字证书的机构,作为受信任的第三方,承担公钥体系中公钥的合法性校验的责任。CA为每个使用公钥的用户颁发一个数字证书,并且对该证书进行签名。CA自己也拥有一个证书(含公钥),任何人都能得到CA的证书,用来验证CA所签发的证书。数字签名:用私钥对某个文件/某段消息的散列值进行加密。验证数据的完整性和是否被篡改。在通信中,双方每次在写完消息之后,计算消息的散列值,并用自己的私钥加密生成数字签名,附在信件后面 ,接收者在收到消息和数字签名之后,先计算散列原创 2020-07-01 18:50:15 · 217 阅读 · 0 评论 -
grpc和go module
RPC就是要像调用本地的函数一样去调远程函数。但是在调用远程函数的时候会出现一些问题:Call ID映射。在本地调用中,函数体是直接通过函数指针来指定的,我们调用函数时,编译器就自动帮我们调用它相应的函数指针。但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,必须附上这个ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <–> Call ID}原创 2020-06-30 13:13:50 · 397 阅读 · 0 评论 -
Channel
goroutine之间的通信使用channel。数据传送是阻塞式的,发了数据之后必须有人来收数据。func chanDemo() { //var c chan int // c == nil c := make(chan int) go func() { //这里的匿名函数相当于闭包,引用了外面的c变量 for { n := <-c //开了一个goroutine去接数据 fmt.Println(n) } }() c <- 1 //往channel中发生数据原创 2020-06-28 17:07:26 · 4505 阅读 · 0 评论 -
goroutine
goroutinefunc main() { for i := 0; i < 1000; i++ { go func(i int) { for { fmt.Printf("Hello from "+"goroutine %d\n", i) } }(i) } time.Sleep(time.Millisecond)}goroutine其实是一种协程coroutine。协程是轻量级的“线程”,线程是由OS进行调度的,因此在任何时候都可以被抢占的,而协程是非抢占原创 2020-06-11 14:58:45 · 210 阅读 · 0 评论 -
测试与性能调优
测试go语言测试文件命名:name_test.go,编译器就是识别这个测试文件。go test . 执行当前目录下的测试文件。func TestSubStr(t *testing.T) { //表格驱动测试 tests := []struct { s string ans int }{ //Normal cases {"abcabcabc", 3}, {"pwwkew", 3}, //Edge cases {"", 0}, {"abcabcabcd", 4}原创 2020-06-09 18:29:56 · 217 阅读 · 0 评论 -
错误处理
defer的调用确保调用在函数结束的时候发生参数在defer语句时计算defer列表为后进先出func writeFile(filename string) { file, err := os.Create(filename) if err != nil { panic(err) } defer file.Close() //确保在函数结束的时候关闭文件 //直接用file写比较慢,使用bufio,先写到内存里,当内容大到一定的程度之后,再写到文件中 writer := bufio.原创 2020-06-07 17:03:16 · 210 阅读 · 0 评论 -
函数式编程
函数与闭包函数是一等公民:参数、变量、返回值都可以是函数,函数也可以实现接口。在C++中就只有函数指针。“正统”的函数式编程:不能有状态,只能有函数和常量;每个函数只能有一个参数。go语言没有Lambda表达式,但是支持匿名函数。一个持有外部自由变量的函数就是闭包。要搞清楚闭包的关键,就是要分析出返回的函数它使用(引用)到哪些变量,因为函数和它引用到的变量共同构成闭包。func adder() func(int) int { sum := 0 //自由变量 return func(v int原创 2020-06-06 16:57:17 · 113 阅读 · 0 评论 -
面向接口
duck typing的概念描述事物的外部行为而非内部结构。在动态语言设计中,可以解释为无论一个对象是什么类型的,只要它具有某类型的行为(方法),则它就是这一类型,而不在于它是否显示的实现或者继承。动态类型语言:是在运行时确定数据类型的语言,变量在使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。如Python静态类型语言:在编译时变量的数据类型就可以确定的语言。如C++像C++一类的静态类型语言,传入的参数必须要是所要求的类型才行,要想表现出不同的行为,就得通过继承、多态等机制。原创 2020-06-06 15:16:34 · 194 阅读 · 0 评论 -
面向对象
结构体和方法go语言仅支持封装,不支持多态和继承,使用接口来实现。因此只有struct,没有class。一律使用点来访问成员。type treeNode struct { value int left, right *treeNode}func main() { var root treeNode //go语言提供了非常多的构造方法,因此没有构造函数的说法 root = treeNode{value:3} root.left = &treeNode{} root.righ原创 2020-06-05 17:20:52 · 122 阅读 · 0 评论 -
内建容器
数组定义数组 var arr1 [5]int arr2 := [3]int{1,3,5} arr3 := [...]int{2,4,6,8} //使用编译器来推断数组中的元素[...],如果不写...就是切片 fmt.Println(arr1, arr2, arr3) var grid [4][5]int fmt.Println(grid)遍历数组for i := 0; i < len(arr3); i++{ fmt.Println(arr3[i]) } for i, v原创 2020-06-05 13:51:50 · 146 阅读 · 0 评论 -
go语言基础
变量定义//在函数外面不能使用 : 来定义变量//使用var()实现集中定义var ( aa = 3 // 作用域 包内部 ss = "kkk" bb = true)func variableZeroValue() { var a int // 默认值为0 var s string //变量的类型在后,定义了变量之后,之后必须使用到。默认初值为0 fmt.Printf("%d %q", a, s) fmt.Println()}func variableInitialV原创 2020-06-02 15:54:22 · 140 阅读 · 0 评论