Go
Radioman-lhq
不要在最能吃苦的时候,选择安逸
展开
-
Go语言测试与性能调优之测试
一、传统测试 vs 表格驱动测试传统测试:1.测试数据和测试逻辑混在一起2.出错信息不明确3.一旦一个数据出错测试全部结束表格驱动测试1.分离了测试数据和测试逻辑2.明确了错误信息3.可以部分失败4.go语言的语法使得我们更易实践表格驱动测试5.testing.T的使用二、测试实例1.以测试文件名必须以_test结尾,如:add_test2.测试函数必须以Test开头,如...原创 2019-02-14 19:35:01 · 198 阅读 · 1 评论 -
Go语言面向对象之结构体和方法
一、面向对象1.go语言仅支持封装,不支持继承和多态2.go语言中没有class,只有struct二、结构的定义type TreeNode struct {Left, Right *TreeNodeValue int}三、结构的创建1.不论地址还是结构本身,一律使用.来访问成员2.使用自定义工厂函数3.注意返回了局部变量的地址示例1:type treeNode str...原创 2019-02-11 14:56:02 · 254 阅读 · 0 评论 -
Go语言面向对象之包和封装
一、封装1.名字一般使用CamelCase2.首字母大写:public3.首字母小写:private二、包1.每个目录一个包2.main包包含可执行入口3.为结构定义的方法必须放在同一个包内4.可以是不同的文件...原创 2019-02-11 15:16:43 · 178 阅读 · 0 评论 -
Go语言面向对象之扩展已有类型
一、如何扩充系统类型或者别人的类型1.定义别名示例1:type MyTreeNode struct { node *tree.Node}func (myNode *MyTreeNode) postOrder(){ if myNode == nil || myNode.node == nil { return } left := MyTreeNode{...原创 2019-02-11 16:08:04 · 428 阅读 · 1 评论 -
Go语言面向接口之duck typing
一、duck typing1.“像鸭子走路,像鸭子叫(长得像鸭子),那么就是鸭子”2.描述事物的外部行为而非内部结构3.严格说go属于结构化系统类型,类似duck typing二、其他语言中的duck typing1.python中的duck typingdef download(retriever):return retriever.get("www.imooc.com")a....原创 2019-02-11 18:50:06 · 369 阅读 · 0 评论 -
Go语言面向接口之接口的定义
一、接口的定义1.接口由使用者定义示例1:type Retriever interface { Get(url string) string}func download(r Retriever) string{ return r.Get("http://www.imooc.com")}二、接口的实现1.接口的实现是隐式的2.只要实现接口里的方法示例2:func...原创 2019-02-11 20:52:11 · 283 阅读 · 0 评论 -
Go语言面向接口之接口的值类型
一、接口变量包含的内容1.实现者的类型2.实现者的值/实现者的指针3.接口变量自带指针4.接口变量同样采用值传递,几乎不需要使用接口的指针5.指针接收者实现只能以指针方式使用;值接收者都可二、查看接口变量1.表示任何类型:interface{}2.Type Assertion示例1:if retriever, ok := r.(mock.Retriever); ok { ...原创 2019-02-12 20:52:04 · 382 阅读 · 0 评论 -
Go语言面向接口之接口的组合
一、接口的组合示例1:type Retriever interface { Get(url string) string}type Poster interface { Post (Url string, form map[string]string) string}type RetrieverPoster interface { Retriever Pos...原创 2019-02-12 21:26:40 · 300 阅读 · 0 评论 -
Go语言函数式编程
一、函数式编程 vs 函数指针1.函数是一等公民:参数,变量,返回值都可以是函数;2.高阶函数;3.函数->闭包二、“正统”函数式编程1.不可变性:不能有状态,只有常量和函数2.函数只能由一个参数三、闭包1.局部变量2.自由变量Go语言中的闭包示例:func adder() func(int) int{ sum := 0 return func(v in...原创 2019-02-13 11:29:51 · 213 阅读 · 0 评论 -
Go语言错误处理和资源管理之defer调用
1.确保调用在函数结束时发生2.参数在defer语句是计算示例1:func tryDefer() { for i :=0; i < 100; i++ { defer fmt.Println(i) if i == 30 { panic("printed too many") } }}3.defer列表为后进先出示例...原创 2019-02-13 18:11:31 · 130 阅读 · 0 评论 -
Go语言错误处理和资源管理之错误处理
一、错误处理示例:_, err := os.Open("c.txt")if err != nil { if pathError, ok := err.(*os.PathError); ok{ fmt.Println(pathError.Err) } else { fmt.Println("unknuown error", err) }}二、创建e...原创 2019-02-13 18:13:01 · 219 阅读 · 0 评论 -
Go语言错误处理和资源管理之panic和recover
一、panic1.停止当前函数执行2.一直向上返回,执行每一层的defer3.如果没有遇见recover,程序退出二、recover1.仅在defer调用中使用2.获取panic3.如果无法处理,可重新panic示例:func tryRecover() { defer func() { r := recover() if err, ok := r....原创 2019-02-13 18:14:04 · 195 阅读 · 0 评论 -
Go语言Goroutine
一、协程Coroutine1.轻量级“线程”;2.非抢占式多任务处理,由协程主动交出控制权;3.编译器/解释器/虚拟机层面的多任务;4.多个协程可能在一个或多个线程上运行;二、其他语言中的协程C++:Boost.CoroutineJava:不支持python:使用yield关键字实现协程python3.5:使用async def 对协程进行了原生支持三、goroutine的定义...原创 2019-02-20 11:36:03 · 121 阅读 · 0 评论 -
Go语言channel
一、channel1.定义channel类型var c chan intc1 := make(chan int)c2 := make(chan int, 3)2.向channel发数据var c chan intc <- 13.从channel收数据var c chan intn := <-c二、channel基本操作1.向channel收发数据func...原创 2019-02-20 11:38:33 · 165 阅读 · 0 评论 -
Go语言内建容器之字符和字符串处理
一、rune相当于go语言中的char1.使用range遍历pos,rune对2.使用utf8.RuneCountInString获得字符数量3.使用len获得字节长度4.使用[]byte获得字节二、遍历字符串示例1:s := "Yes我爱你!"for i, v := range []rune(s){ fmt.Printf("(%d, %c)", i, v)}三、其他字...原创 2019-02-11 13:54:17 · 232 阅读 · 0 评论 -
Go语言内建容器之Map
一、Map的定义1.map[K]V示例1:m := map[string]string{ "name": "cpp", "teacher": "radiomen",}fmt.Println(m)示例2:m2 := make(map[string]int) // m2 == empty mapfmt.Println(m2)示例3:var m3 map[string...原创 2019-02-11 13:29:29 · 224 阅读 · 0 评论 -
Go语言测试与性能调优之http测试
一、通过使用假的Request/Response示例1:// 没有错误const noErrorStr = "no error"func noError(writer http.ResponseWriter, request *http.Request) error { fmt.Fprintln(writer, noErrorStr) return nil}type t...原创 2019-02-14 19:36:29 · 356 阅读 · 1 评论 -
Go语言生成文档和示例代码
一、生成文档1.查看文档命令:go doc2.生成文档命令:godoc -http :60603.帮助命令:go help doc二、Go语言生成示例代码1.示例文件名必须以_test结尾,如:queue_test2.示例函数必须以Example开头,如:ExampleQueue_Pop3.示例输入必须使用:// Output:4.可以使用go test命令执行示例文件示例如下:...原创 2019-02-14 19:37:25 · 737 阅读 · 1 评论 -
使用GoLand搭建Go开发环境
一、下载安装Go语言编译器下载地址:https://studygolang.com/dl二、下载安装GoLand下载地址:https://www.jetbrains.com/go/download/三、破解GoLand步骤1:下载文件【JetbrainsCrack-4.2-release-enc.jar】链接:https://pan.baidu.com/s/1VR3wLEsWJ8bnM...原创 2019-02-04 22:35:49 · 202 阅读 · 0 评论 -
使用IDEA搭建Go开发环境
一、下载安装Go语言编译器下载地址:https://studygolang.com/dl二、下载安装IDEA下载地址:https://www.jetbrains.com/idea/三、安装破解IDEA步骤1:下载文件【JetbrainsCrack-4.2-release-enc.jar】链接:https://pan.baidu.com/s/1VR3wLEsWJ8bnM8r-p92rJw...原创 2019-02-04 23:08:40 · 1974 阅读 · 0 评论 -
Go语言基本语法之变量定义
一、var关键字1、var a, b, c bool2、var s1, s2 string = “hello”, “world”3、可放在函数内,或直接放在包内4、使用var()集中定义变量示例:var (aa = 3ss = "kkk"bb = true)二、让编译器自动决定类型1、var a, b, i, s1, s2 = true, false, 3, "hello...原创 2019-02-06 21:41:15 · 159 阅读 · 0 评论 -
Go语言基本语法之内建变量类型
一、常用内建变量类型1.bool, string2.(u)int, (u)int8, (u)int16, (u)int32, (u)int64, uintptr3.byte alias for uint84.rune alias for int325.float32, float64, complex64, complex128二、Go语言强制类型转换示...原创 2019-02-06 21:42:35 · 149 阅读 · 0 评论 -
Go语言基本语法之常量的定义
一、常量的定义1.const filename = "abc.txt"2.const 数值可作为各种类型使用二、枚举类型1、普通枚举类型示例如下:const ( java = 0 cpp = 1 python = 2 goland = 3)2.自增值枚举类型示例如下:const ( b = 1 << (10 * iota) k...原创 2019-02-06 21:43:58 · 1411 阅读 · 0 评论 -
Go语言基本语法之条件语句
一、if1、if条件中不需要括号2、if的条件里可以赋值3、if的条件里赋值的变量作用域就在这个if语句里示例:const filename = "abc.txt"if contents, err := ioutil.ReadFile(filename); err != nil { fmt.Println(err)} else { fmt.Printf("%s\n", c...原创 2019-02-06 22:33:51 · 170 阅读 · 0 评论 -
Go语言基本语法之循环
1.for的条件里不需要括号2.for的条件里可以省略初始条件,结束条件,递增表达式;示例1:省略初始条件func converToBin(n int) string{ result := "" for ; n > 0; n /= 2 { lsb := n % 2 result = strconv.Itoa(lsb) + result } ...原创 2019-02-10 16:35:17 · 243 阅读 · 0 评论 -
Go语言基本语法之函数
1.函数可以返回多个值示例1:func div(a, b int) (int, int){ return a / b, a % b}2.函数返回多个值时可以起名字(仅用于非常简单的函数),对于调用者而言没有区别示例2:package mainimport "fmt"func div(a, b int) (q, r int){ q = a / b r = ...原创 2019-02-10 17:57:27 · 212 阅读 · 0 评论 -
Go语言基本语法之指针
1.指针的定义示例1:var a int = 2var pa *int = &a*pa = 3fmt.Println(a)注意:Go语言中指针不能运算2.Go语言只有值传递一种方式示例2:package mainimport “fmt”func swap(a, b *int) {*a, *b = *b, *a}func main() {a, b := 3, ...原创 2019-02-10 19:47:45 · 226 阅读 · 0 评论 -
Go语言内建容器之数组
一、Go语言中数组定义var array1 [5]intarray2 := [3]int{1, 3, 5}array3 := [...]int{2, 4, 6, 8, 10}var grid [3][4]bool注意:Go语言中数组定义时数组长度写在类型前二、遍历数组元素1.可通过_省略变量2.不仅range,任何地方都可以通过_省略变量3.如果只要i,可写成for i:= r...原创 2019-02-10 21:06:44 · 193 阅读 · 0 评论 -
Go语言内建容器之切片
一、Go语言中切片定义1.Slice本身没有数据,是对底层array的一个view2.修改Slice中的某一个值,原数组中的值也会更新示例1:arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}fmt.Println("arr[2:6] = ", arr[2:6])fmt.Println("arr[:6] = ", arr[:6])fmt.Println("...原创 2019-02-10 22:00:09 · 130 阅读 · 0 评论 -
Go语言使用channel等待任务结束
一、使用channel来等待goroutine结束方法一:type worker struct { in chan int done chan bool}func doneWorker(id int, w worker) { for n := range w.in { fmt.Printf("worker %d received %c\n", id, n)...原创 2019-02-20 11:41:21 · 978 阅读 · 0 评论