不灭的火

革命尚未成功,同志仍须努力下载JDK17

作者:AlbertWen  添加时间:2017-10-29 20:21:55  修改时间:2025-07-18 09:59:20  分类:16.编程基础/Web安全  编辑

每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在 Git 里,这个分支叫主分支,即 master 分支。HEAD 严格来说不是指向提交,而是指向 mastermaster 才是指向提交的,所以,HEAD 指向的就是当前分支。

一开始的时候,master 分支是一条线,Git 用 master 指向最新的提交,再用 HEAD 指向 master,就能确定当前分支,以及当前分支的提交点:

作者:AlbertWen  添加时间:2019-03-30 22:48:12  修改时间:2025-07-05 16:30:57  分类:15.OpenResty_Lua  编辑

语句 break 用来终止 while、repeat 和 for 三种循环的执行,并跳出当前循环体, 继续执行当前循环之后的语句。

作者:AlbertWen  添加时间:2017-11-19 18:27:20  修改时间:2025-07-19 05:18:22  分类:14.Golang/Ruby  编辑

如何控制 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-07-18 19:55:13  分类:13.C/C++/仓颉  编辑

传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。这意味着只需要访问这个对象的函数才有访问权限,而且也不需要复制对象。

作者:AlbertWen  添加时间:2019-01-12 09:42:13  修改时间:2025-07-17 19:44:31  分类:08.Java基础  编辑

可以将 ArrayList想象成一种“会自动扩增容量的Array”

作者:AlbertWen  添加时间:2019-05-10 15:09:09  修改时间:2025-07-18 16:27:49  分类: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-07-08 17:57:01  分类:14.Golang/Ruby  编辑

上一篇文章 说到了 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-07-19 04:37:24  分类:14.Golang/Ruby  编辑
作者:AlbertWen  添加时间:2017-12-03 10:07:12  修改时间:2025-05-22 19:10:12  分类:电脑/软件使用  编辑

Mac 下,不要升级 Jetbrains 系列产品到 2017.3,工具栏是乱的,bug 比较多

作者:AlbertWen  添加时间:2019-09-08 23:33:00  修改时间:2025-07-18 22:20:07  分类:13.C/C++/仓颉  编辑
int accept(int s, struct sockaddr *addr, int *addrlen);

accept()用来接受参数s 的socket 连线。参数s 的socket 必需先经bind()、listen()函数处理过,当有连线进来时accept()会返回一个新的socket 处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s 的socket 能继续使用accept()来接受新的连线要求。