golang

Golang Sqlite3 报register db 'default', U S 错误

守給你的承諾、 提交于 2020-03-17 02:02:41
某厂面试归来,发现自己落伍了!>>> 在win7,32位系统下,Golang Sqlite3 报register db 'default', U S 错误 解决办法: 1.下载MinGW32 2.设置系统环境,path包含C:\MinGW32\bin 3.重新go get github.com/mattn/go-sqlite3(有老版本需删除) 4.下载 sqlite( Precompiled Binaries for Windows sqlite-dll-win32-x86 某版本 ) 5.sqlite3.dll放置于C:\Windows\System32 6 .关键步骤: 然后修改mattn/go-sqlite3/sqlite3-windows.go里的#cgo LDFLAGS: -lmingwex -lmingw32一行..在后面加入 -lgcc_s 为#cgo LDFLAGS: -lmingwex -lmingw32 -lgcc_s 然后再go install. 来源: oschina 链接: https://my.oschina.net/u/229664/blog/162701

golang的reflection(转)(一)

让人想犯罪 __ 提交于 2020-03-17 02:01:18
某厂面试归来,发现自己落伍了!>>> 反射reflection 可以大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射可以使用TypeOf和ValueOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字段的本质) 想要利用反射修改对象状态,前提是interface.data是settable,即pointer-interface 通过反射可以“动态”调用方法 常用的类型、函数和方法 // 返回动态类型i的类型,如果i是一个空结构体类型,TypeOf将返回nil func TypeOf(i interface {}) Type // Type 接口类型 type Type interface { Align() int FieldAlign() int // 指定结构体中方法的下标,返回某个方法的对象,需要注意的是返回的Method是一个独立的结构体 Method( int ) Method /* type Method struct { Name string PkgPath string Type Type Func Value Index int } */ MethodByName( string ) (Method, bool ) // 返回该结构体类型的方法下标 NumMethod() int // 返回类型的名称,即动态类型i的名称

golang实现类似var_dump()功能

为君一笑 提交于 2020-03-17 02:00:33
某厂面试归来,发现自己落伍了!>>> PHP的var_dump()打印变量信息会有换行和缩进, 阅读起来非常方便. 但在golang通过fmt.Fprintf("%#v", a)打印变量信息的时候却不换行, 阅读起来不方便. 网上找了几个实现var_dump()类似功能的包, 用起来都不很顺手, 下面简单实现一个(源代码存在github上面). 安装: go get github.com/liudng/godump 示例代码: package main import ( "github.com/liudng/godump" ) func main() { a := make(map[string]int64) a["A"] = 1 a["B"] = 2 //打印变量信息 godump.Dump(a) } 输出结果: (map[string]int64) A(int64) 1 B(int64) 2 默认缩进2个字符, 希望实现4个字符的同学直接修改源码吧 来源: oschina 链接: https://my.oschina.net/u/144428/blog/344147

golang在32位系统下atomic.AddUint64导致程序崩溃及解决办法

被刻印的时光 ゝ 提交于 2020-03-17 01:57:19
某厂面试归来,发现自己落伍了!>>> package main import ( "sync/atomic" "unsafe" ) type a struct { x unsafe.Pointer y uint64 } func main() { p := new(a) atomic.AddUint64(&p.y, 1) } 在32位计算机上运行改程序,会出现错误: panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x0 addr=0x0 pc=0x4198bc] goroutine 1 [running]: runtime.panic(0x41c740, 0x445e4f) C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist550409343/go/src/pkg/runtime/panic.c:266 +0xa6 sync/atomic.AddUint64(0x114434ac, 0x1, 0x0, 0x4107e3, 0x397fcc) C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist550409343/go/src/pkg/sync/atomic

golang: 利用unsafe操作未导出变量

心不动则不痛 提交于 2020-03-17 01:29:17
某厂面试归来,发现自己落伍了!>>> 看了 @喻恒春 大神的利用unsafe.Pointer来突破私有成员,觉得例子举得不太好。而且不应该简单的放个demo,至少要讲一下其中的原理,让看的童鞋明白所以然。see: http://my.oschina.net/achun/blog/122540 unsafe.Pointer其实就是类似C的void *,在golang中是用于各种指针相互转换的桥梁。uintptr是golang的内置类型,是能存储指针的整型,uintptr的底层类型是int,它和unsafe.Pointer可相互转换。uintptr和unsafe.Pointer的区别就是:unsafe.Pointer只是单纯的通用指针类型,用于转换不同类型指针,它不可以参与指针运算;而uintptr是用于指针运算的,GC 不把 uintptr 当指针,也就是说 uintptr 无法持有对象,uintptr类型的目标会被回收。golang的unsafe包很强大,基本上很少会去用它。它可以像C一样去操作内存,但由于golang不支持直接进行指针运算,所以用起来稍显麻烦。 切入正题。利用unsafe包,可操作私有变量(在golang中称为“未导出变量”,变量名以小写字母开始),下面是具体例子。 在$GOPATH/src下建立poit包,并在poit下建立子包p,目录结构如下: $GOPATH

golang 与 php 的运算比较

孤者浪人 提交于 2020-03-16 20:49:21
某厂面试归来,发现自己落伍了!>>> php 运算代码 <?php $startTime = microtime(true); $sum = 0; for($i = 1; $i <= 100000000; $i++){ $sum++; } $endTime = microtime(true); echo $sum; $runtime = ($endTime - $startTime) * 1000; //将时间转换为毫秒 echo "运行时间: {$runtime} 毫秒"; golang 运行代码 package main import ( "fmt" "time" ) func test() { start := time.Now() sum := 0 for i := 0 ; i < 100000000 ; i++ { sum ++ } elapsed := time.Since(start) fmt.Println(sum) fmt.Println("耗时:", elapsed) } func main() { test() } 重复三次取平均值: php5.6 :9780.9720039368 毫秒 php7.2 :1030.2329063416 毫秒 golang :54.449365ms 来源: oschina 链接: https://my.oschina.net

golang之panic,recover,defer

醉酒当歌 提交于 2020-03-16 05:51:39
defer,recover: 运行时恐慌一旦被引发,就会向调用方传播直至程序崩溃。 recover内建函数用于“拦截”运行时恐慌,可以使当前的程序从恐慌状态中恢复并重新获得流程控制权。 recover函数被调用后,会返回一个interface{}类型的结果。如果当时的程序正处于运行时恐慌的状态,那么这个结果就是非nil的 package main import ( "fmt" "time" ) func test() { defer func() { //defer中使用recover来捕获异常 //defer在函数执行结束最后,执行该方法 if err := recover(); err != nil { fmt.Println(err) } }() b := 0 a := 100 / b fmt.Println(a) return } func main() { for { test() time.Sleep(time.Second) } var a []int a = append(a, 10, 20, 383) a = append(a, a...) fmt.Println(a) } panic: 为了报告运行期间的致命错误 用于停止当前的控制流程并引发一个运行时错误,它可以接受一个任意类型的参数值,参数值类型常常是string或者error package main

Golang 入门 : 数组

柔情痞子 提交于 2020-03-16 03:06:46
数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int、string 等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。在 Golang 中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说 [5]int 和 [10]int 是两个不同的类型。Golang 中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。 本文将介绍 Golang 数组的基本概念和用法,演示环境为 ubuntu 18.04 & go1.10.1。 Golang 数组的特点 我们可以把 Golang 数组的特征归纳为以下三点: 固定长度 :这意味着数组不可增长、不可缩减。想要扩展数组,只能创建新数组,将原数组的元素复制到新数组。 内存连续 :这意味可以在缓存中保留的时间更长,搜索速度更快,是一种非常高效的数据结构,同时还意味着可以通过数值的方式(arr[index])索引数组中的元素。 固定类型 :固定类型意味着限制了每个数组元素可以存放什么样的数据,以及每个元素可以存放多少字节的数据。 数组是个固定长度的数据类型,其长度和存储元素的数据类型都在声明数组时确定,并且不能更改。如果需要存储更多的元素,必须先创建一个更长的数组

golang生成随机函数的实现

强颜欢笑 提交于 2020-03-15 17:24:36
golang生成随机数可以使用math/rand包, 示例如下: package main import ( "fmt" "math/rand" ) func main() { for i:=0; i<10; i++ { fmt.Println(rand.Intn(100)) } } 而发现这种情况,每次执行的结果一样. 修改如下: package main import ( "fmt" "time" "math/rand" ) func main() { r := rand.New(rand.NewSource(time.Now().UnixNano())) for i:=0; i<10; i++ { fmt.Println(r.Intn(100)) } } 而这种方式就可以使用时间种子来获取不同的结果了。 示例2: package main import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) for i := 0; i < 10; i++ { x := rand.Intn(100) fmt.Println(x) } } 例子是打印10个100以内(0-99)的随机数字。 来源: https://www.cnblogs.com/unqiang/p/6677863

Redis 基础数据结构

僤鯓⒐⒋嵵緔 提交于 2020-03-15 01:03:50
string (字符串) 是一种键值对的数据结构,定义一个唯一的key值来获取相应的value数据。 > set name codehole OK > get name "codehole" > exists name (integer) 1 > del name (integer) 1 > get name (nil) 批量操作 > set name1 codehole OK > set name2 holycoder OK > mget name1 name2 name3 # 返回一个列表 1) "codehole" 2) "holycoder" 3) (nil) > mset name1 boy name2 girl name3 unknown > mget name1 name2 name3 1) "boy" 2) "girl" 3) "unknown" 可以对 key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间。 > set name codehole > get name "codehole" > expire name 5 # 5s 后过期 ... # wait for 5s > get name (nil) > setex name 5 codehole # 5s 后过期,等价于 set+expire > get name "codehole" .