![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go
文章平均质量分 63
两个幽灵
这个作者很懒,什么都没留下…
展开
-
[golang] 什么情况下reflect.IsValid 返回 false?
IsValid 方法的目的是报告 reflect.Value 本身是否有效,而不是其 wrap 的值是否有效。在接收者是零值的时候返回 false,大多数函数/方法永远不会返回无效值。下面所有的例子都返回 false(除非特殊说明)。注意下面这种返回 true。翻译 2023-02-15 09:51:40 · 360 阅读 · 1 评论 -
Golang Map 基本原理
Go 语言中的 map 即哈希表。哈希表把元素分到多个桶里,每个桶里最多放8个元素。在访问元素时,首先用哈希算法根据 key 和哈希表种子获得哈希值(暂将其命名为 h),然后利用 h 的低 bbb 位得到桶的序号。其中桶的个数为 2b2^b2b 个,是 2 的幂。桶中存储了所有元素的 key、value 和 key 哈希值的高 8 位。所以在找到桶之后会遍历元素的高 8 位哈希值,判断与 h 的高 8 位哈希值是否相等,若相等则再对比 key。如果在当前桶中没有找到 key,还会与溢出桶的元素进行比较。在哈原创 2022-12-03 21:50:16 · 822 阅读 · 0 评论 -
Go Mod/Module 学习
Go Module 简略使用说明翻译 2022-06-06 17:00:14 · 332 阅读 · 0 评论 -
Go语言学习草稿(14) Context
就是让Goroutine以更优雅的方式退出 package main import ( "context" "fmt" "sync" "time" ) /*标题: Context*/ func genNumbers(ctx context.Context) <-chan int { dst := make(chan int) n := 1 go func() { for { select { case <-ctx.Done(): // 结束了就返回 r转载 2020-08-25 19:39:02 · 96 阅读 · 0 评论 -
Go语言学习草稿(13) 数据库
MySQL 使用普通的 “database/sql” package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" // 必须导入这个执行里面的init() ) // 安装MySQL驱动: go get -u github.com/go-sql-driver/mysql var db *sql.DB // db是一个连接池对象 // 连接数据库 func initDB() (err error) {转载 2020-08-25 16:23:51 · 114 阅读 · 0 评论 -
Go语言学习草稿(12) 测试
单元测试 代码 main.go package main import ( "strings" ) /*标题: 单元测试和性能基准测试*/ // 待测试的字符串切割函数 func Split(str string, sep string) []string { var ret []string index := strings.Index(str, sep) for index >= 0 { ret = append(ret, str[:index]) str = str[ind转载 2020-08-25 14:40:38 · 117 阅读 · 0 评论 -
Go语言学习草稿(11) 网络编程
TCP和UDP package main import ( "bufio" "bytes" "encoding/binary" "fmt" "io" "net" "strconv" "strings" "time" ) // TCP服务器 func tcpServer() { listener, err := net.Listen("tcp", "127.0.0.1:20001") if err != nil { fmt.Println("启动TCP服务器失败, 原因是:",转载 2020-08-23 19:09:05 · 153 阅读 · 0 评论 -
Go语言学习草稿(10) 并发编程
package main import ( "fmt" "math/rand" "runtime" "strconv" "sync" "sync/atomic" "time" ) /*标题: 并发编程*/ func hello() { fmt.Println("Hello!") } // 最简单的 Goroutine 示例 // Goroutine 类似于线程和协程 // 协程每次只有一个在执行, 而 Goroutine 可以有多个同时执行 // 线程创建后会同时存在, 而 Goro转载 2020-08-23 15:08:34 · 113 阅读 · 0 评论 -
Go语言学习草稿(9) 反射
package main import ( . "fmt" "reflect" ) /*标题: 反射*/ // 获得变量类型 func reflectType(x interface{}) { v := reflect.TypeOf(x) Println("type:", v, "\ttype name:", v.Name(), "\ttype kind:", v.Kind()) } type cat struct {} func reflectTypeTest() { // 输出: t转载 2020-08-22 21:07:51 · 111 阅读 · 0 评论 -
Go语言学习草稿(8) 文件和时间
package main import ( "bufio" . "fmt" "io" "io/ioutil" "os" "runtime" "time" ) // 使用os包读取文件 func readFileUsingBaseMethod() { Println(os.Getwd()) // 获得当前工作目录 f, err := os.Open(`go-learn\pkg\calc.go`) if err != nil { Printf("打开文件失败, 原因是%v\n", e转载 2020-08-22 17:25:50 · 139 阅读 · 0 评论 -
Go语言学习草稿(7) 包
文件1 package adder import "fmt" /* 本文件位于 $GOPATH/src/github.com/go-learn/pkg 文件名是 calc.go 代码的执行顺序是 全局变量->init()->main() main()只有在package main中才有用 */ // 一个文件夹中只能有一个包 func Add(x, y int) int { return x + y } // 包的初始化函数 func init() { fmt.Println("导入转载 2020-08-22 15:27:48 · 108 阅读 · 0 评论 -
Go语言学习草稿(6) 接口
package main import "fmt" // 只要实现了speak方法, 就是speaker类型 type speaker interface { speak( /*可以写参数*/) /*可以写返回值*/ } type cat struct{} type dog struct{} // 使用值接收者实现方法 func (d dog) speak() { fmt.Println("汪汪汪") } // 使用指针接收者实现方法 // 此时speaker对象只能存结构体指针类型的变量转载 2020-08-22 12:47:02 · 114 阅读 · 0 评论 -
Go语言学习草稿(5) 结构体
package main import ( "encoding/json" "fmt" ) // 标题: 结构体 type myInt int32 // 自定义一个myint类型, 实际是int32 type intAlias = int64 // 类型别名 func customTypeTest() { fmt.Printf("%T\n", myInt(100)) // 输出main.myInt fmt.Printf("%T\n", intAlias(100)) // 输出转载 2020-08-22 11:47:53 · 123 阅读 · 0 评论 -
Go语言学习草稿(4) 函数
package main import ( "fmt" "strings" ) // 标题: 函数 func sum(x int, y int) int { return x + y } // 命名返回值相当于在函数中声明了一个变量 // 命名返回值可以不写return后面的东西 func sub(x int, y int) (ret int) { ret = x - y return } // 两个返回值 // 当有n个参数的类型一致时, 可以省略(n-1)个参数的类型 func swa转载 2020-08-21 20:39:36 · 106 阅读 · 0 评论 -
Go语言学习草稿(3) 指针和Map
package main import "fmt" func main() { // & 取地址 // * 根据地址取值 var n = 18 var p *int = &n fmt.Printf("%T \t%v\n%T \t%v\n", p, p, *p, *p) // 运行结果: // *int 0xc00000a0b0 // int 18 // make是给slice, map和chan申请内存的 // new 分配内存空间返回指针转载 2020-08-21 14:43:27 · 116 阅读 · 0 评论 -
Go语言学习草稿(2) 控制语句 数组 切片
package main import "fmt" // 标题: 控制语句和数组 func main() { // if 语句 age := 19 if age > 18 { fmt.Println("成年人") } else { fmt.Println("未成年人") } if year := 2020; year > 2000 { // 变量定义和比较放在一行 fmt.Println("21世纪") } else { fmt.Println("活在历史中"转载 2020-08-19 23:10:51 · 101 阅读 · 0 评论 -
Go语言学习草稿(1) 变量
变量和常量 package main import "fmt" // 定义变量, 不能赋值 var name string // 批量定义变量 (常用) var ( age int ok bool ) // 定义常量 const PI = 3.1415926 // 批量定义常量 const ( STATUS_OK = 200 STATUS_NOT_FOUND = 404 ) // 定义常量, 省略值 const ( N1 = 100 N2 // 不赋值默认跟上一行一样转载 2020-08-19 20:47:01 · 150 阅读 · 0 评论