# Go语言中interface{}指针赋值

2 min read
文章目录

前言

在 Go 中,可以通过传递指针来改变函数外部变量的值,例如:

func main() {
var a int = 1
fmt.Println(a) // 1
change(&a,2)
fmt.Println(a) // 2
}
func change(a *int, b int) {
// 通过解引用来改变外部变量的值
*a = b
}

但是在某些情况下,我们可能需要传递interface{}来接收任意的指针变量,这时候就会遇到一个问题,interface{}类型声明的变量是不能直接赋值指针的,例如:

func main() {
var a int = 1
fmt.Println(a) // 1
change(&a,2)
fmt.Println(a) // 2
}
func change(a interface{},b interface{}) {
// 这一行会报错: invalid operation: cannot indirect a (variable of type interface{})
*a = b
}

解决方案

查阅了一些资料,发现可以通过reflect包来解决这个问题,最终代码为:

func main() {
var a int = 1
fmt.Println(a) // 1
change(&a,2)
fmt.Println(a) // 2
}
func change(a interface{},b interface{}) {
// 通过反射来获取指针的值
val := reflect.ValueOf(a)
val.Elem().Set(reflect.ValueOf(b))
}

或者使用新版本范型特性来解决(推荐):

func main() {
var a int = 1
fmt.Println(a) // 1
// 通过指定范型来获取指针的值
change[int](&a,2)
fmt.Println(a) // 2
}
func change[T any](a *T,b T) {
*a = b
}

More Posts

# 突破神奇的Cloudflare防火墙

6 min read

最近碰到一个神奇的网站,在浏览器可以打开,但是通过 curl 或者 代码访问就直接 403,我估摸着这肯定是做了UA校验,于是请求的时候把浏览器的 UA 给带上,然后访问发现还是 403,不过这也难不倒我,肯定是还有校验其它的请求头,直接浏览器打开 network,把所有的请求头复制过来并且带上,确保我和浏览器在 http 协议层面的请求完全一样,这样不可能会失败了吧,然而运行完发现还是 403。

阅读

评论区