作者:AlbertWen
添加时间:2017-10-29 09:17:16
修改时间:2025-04-01 00:23:12
分类:
14.Golang/Ruby
编辑
一、类型(Type)
反射(reflect)让我们能在运行期探知对象的类型信息和内存结构,这从一定程度上弥(mi)补了静态语言在动态行为上的不足。同时,反射还是实现元编程的重要手段。
和 C 数据结构一样,Go 对象头部并没有类型指针,通过其自身是无法在运行期获知任何类型相关信息的。反射操作所需要的全部信息都源自接口变量。接口变量除存储自身类型外,还会保存实际对象的类型数据。
1 2 | func TypeOf(i interface {}) Type
func ValueOf(i interface {}) Value
|
这 两个 反射入口函数,会将任何传入的对象转换为接口类型。
作者:AlbertWen
添加时间:2017-10-29 21:00:06
修改时间:2025-04-01 11:34:36
分类:
14.Golang/Ruby
编辑
注意:这些“坑”不是bug,只是自己当时没搞明白。
用到的框架为 Beego
1、字典 map 是“引用类型”,本身就是指针,作为参数传递时,直接传 map 变量名即可(不要传 map 变量指针)。
在调用方法内,如果修改了 map 变量值,外部的 map 变量值也会被改变的!
作者:AlbertWen
添加时间:2017-11-19 18:27:20
修改时间:2025-03-31 20:48:31
分类:
14.Golang/Ruby
编辑
如何控制 for 循环一段时间超时自动退出呢?思路很简单,就是在 for 循环中使用 select 监听 channel,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package main
import (
"fmt"
"time"
)
func main() {
timeout := time.After(time.Second * 10)
finish := make ( chan bool )
count := 1
go func () {
for {
select {
case <-timeout:
fmt.Println( "timeout" )
finish <- true
return
default :
fmt.Printf( "haha %d\n" , count)
count++
}
time.Sleep(time.Second * 1)
}
}()
<-finish
fmt.Println( "Finish" )
}
|
这里设置 for 循环 10s 超时。
作者:AlbertWen
添加时间:2017-10-29 09:14:50
修改时间:2025-03-29 14:16:16
分类:
14.Golang/Ruby
编辑
上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的。
反射中调用 函数
众所周知,Golang 中的函数是可以像普通的 int、float 等类型变量那样作为值的,例如:
1 2 3 4 5 6 7 8 9 10 11 12 | package main
import "fmt"
func hello() {
fmt.Println( "Hello world!" )
}
func main() {
hl := hello
hl()
}
|
prints:
既然函数可以像普通的类型变量一样可以的话,那么在反射机制中就和不同的变量是一样的,在反射中 函数 和 方法 的类型(Type)都是 reflect.Func,如果要调用函数的话,可以通过 Value 的 Call() 方法,例如:
1 2 3 4 5 6 | func main() {
hl := hello
fv := reflect.ValueOf(hl)
fmt.Println( "fv is reflect.Func ?" , fv.Kind() == reflect.Func)
fv.Call( nil )
}
|
prints:
1 2 | fv is reflect.Func? true
hello world!
|
Value 的 Call() 方法的参数是一个 Value 的 slice,对应的反射函数类型的参数,返回值也是一个 Value 的 slice,同样对应反射函数类型的返回值。通过这个例子,相信你一看就明白了:
1 2 3 4 5 6 7 8 9 10 11 12 | func prints(i int ) string {
fmt.Println( "i =" , i)
return strconv.Itoa(i)
}
func main() {
fv := reflect.ValueOf(prints)
params := make ([]reflect.Value, 1)
params[0] = reflect.ValueOf(20)
rs := fv.Call(params)
fmt.Println( "result:" , rs[0].Interface().( string ))
}
|
prints:
作者:AlbertWen
添加时间:2017-10-29 10:23:09
修改时间:2025-03-28 08:35:57
分类:
14.Golang/Ruby
编辑
作者:AlbertWen
添加时间:2017-11-01 14:44:31
修改时间:2025-03-30 09:57:38
分类:
14.Golang/Ruby
编辑
有时候 go get 比较慢,可以考虑用迅雷等下载工具下载下来,然后再本地安装,
如:code.google.com/p/go.net/websocket,如何安装这些离线包?
先在你的 GOPATH 目录(如果不懂 GOPATH,请先弄懂)下,创建目录 src:
作者:AlbertWen
添加时间:2017-10-29 09:51:18
修改时间:2025-03-29 16:32:49
分类:
14.Golang/Ruby
编辑
Go 精简(合并)了流控制语句,虽然某些时候不够便捷,但够用。
if...else...
条件表达式值必须是布尔类型,可省略括号,且左花括号不能另起一行。
作者:AlbertWen
添加时间:2017-10-29 20:39:37
修改时间:2025-03-28 20:01:00
分类:
14.Golang/Ruby
编辑
用 glide 下载 goim 的依赖包时报错,提示:
code.google.com/p/log4go 找不到,即下载失败
作者:AlbertWen
添加时间:2017-10-29 20:46:08
修改时间:2025-03-29 23:03:02
分类:
14.Golang/Ruby
编辑
Go 的基本类型共有 18 个,其中 int 和 uint 的实际宽度会根据计算架构的不同而不同。在 386 计算架构下,它的宽度为 32 比特,即 4 字节。在 amd64 (有时也称为 x86-64)计算架构下,它们的宽度为 64 比特。即 8 字节。
byte 可以看作类型 uint8 的别名类型,而 rune 可以看作 int32 的别名类型。rune 类型专用于存储 Unicode 编码的 单个字符。
作者:AlbertWen
添加时间:2017-11-22 14:05:04
修改时间:2025-03-31 21:58:24
分类:
14.Golang/Ruby
编辑
概述
Golang 的 context Package 提供了一种简洁又强大方式来管理 goroutine 的生命周期,同时提供了一种 Requst-Scope K-V Store。但是对于新手来说,Context 的概念不算非常的直观,这篇文章来带领大家了解一下 Context 包的基本作用和使用方法。
1. 包的引入
在 go1.7 及以上版本 context 包被正式列入官方库中,所以我们只需要import "context"
就可以了,而在 go1.6 及以下版本,我们要 import "golang.org/x/net/context"