作者:AlbertWen
添加时间:2017-11-19 18:27:20
修改时间:2025-11-14 02:26:41
分类:
21.Golang编程
编辑
如何控制 for 循环一段时间超时自动退出呢?思路很简单,就是在 for 循环中使用 select 监听 channel,代码如下:
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
添加时间:2016-04-04 22:35:12
修改时间:2025-11-13 09:41:28
分类:
13.C/C++/Rust
编辑
传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。这意味着只需要访问这个对象的函数才有访问权限,而且也不需要复制对象。
作者:AlbertWen
添加时间:2019-01-12 09:42:13
修改时间:2025-11-12 23:37:28
分类:
08.Java基础
编辑
可以将 ArrayList想象成一种“会自动扩增容量的Array”
作者:AlbertWen
添加时间:2019-05-10 15:09:09
修改时间:2025-11-14 22:28:26
分类:
01.Linux基础
编辑
在服务器站点执行 git pull 时,报错:
Your local changes to the following files would be overwritten by merge
error: Your local changes to the following files would be overwritten by merge:
protected/config/main.php
Please, commit your changes or stash them before you can merge.
作者:AlbertWen
添加时间:2017-10-29 09:14:50
修改时间:2025-11-11 16:54:24
分类:
21.Golang编程
编辑
上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的。
反射中调用 函数
众所周知,Golang 中的函数是可以像普通的 int、float 等类型变量那样作为值的,例如:
package main
import "fmt"
func hello() {
fmt.Println("Hello world!")
}
func main() {
hl := hello
hl()
}
prints:
hello world!
既然函数可以像普通的类型变量一样可以的话,那么在反射机制中就和不同的变量是一样的,在反射中 函数 和 方法 的类型(Type)都是 reflect.Func,如果要调用函数的话,可以通过 Value 的 Call() 方法,例如:
func main() {
hl := hello
fv := reflect.ValueOf(hl)
fmt.Println("fv is reflect.Func ?", fv.Kind() == reflect.Func)
fv.Call(nil)
}
prints:
fv is reflect.Func? true
hello world!
Value 的 Call() 方法的参数是一个 Value 的 slice,对应的反射函数类型的参数,返回值也是一个 Value 的 slice,同样对应反射函数类型的返回值。通过这个例子,相信你一看就明白了:
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) // 参数设置为20
rs := fv.Call(params) // rs作为结果接受函数的返回值
fmt.Println("result:", rs[0].Interface().(string)) // 当然也可以直接是 rs[0].Interface()
}
prints:
i = 20
result: 20
作者:AlbertWen
添加时间:2017-10-29 10:23:09
修改时间:2025-11-03 08:46:06
分类:
21.Golang编程
编辑
作者:AlbertWen
添加时间:2017-12-03 10:07:12
修改时间:2025-11-05 14:39:22
分类:
电脑/软件使用
编辑
Mac 下,不要升级 Jetbrains 系列产品到 2017.3,工具栏是乱的,bug 比较多
作者:AlbertWen
添加时间:2019-09-08 23:33:00
修改时间:2025-11-11 04:55:08
分类:
13.C/C++/Rust
编辑
int accept(int s, struct sockaddr *addr, int *addrlen);
accept()用来接受参数s 的socket 连线。参数s 的socket 必需先经bind()、listen()函数处理过,当有连线进来时accept()会返回一个新的socket 处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s 的socket 能继续使用accept()来接受新的连线要求。
作者:AlbertWen
添加时间:2018-05-24 17:17:21
修改时间:2025-10-21 07:01:27
分类:
08.Java基础
编辑
作者:AlbertWen
添加时间:2017-10-29 20:40:37
修改时间:2025-11-07 06:02:09
分类:
06.前端/Vue/Node.js
编辑
使用 jQuery 修改 css 中带有 !important 的样式属性
外部样式为:
div.test {
width:auto !important;
overflow:auto !important
}
通过 $("div.test").css("width","100px"); 和 $("div.test").css("width","100px !important"); 是无效的