结构体数组与接口数组转换
如果想把[]struct转为[]interface,我们发现直接赋值会报错。
理论上interface可以转换任何数据,为什么结构体数组不可以呢?这是因为interface的设计导致的,如果能理解interface的底层实现,就能很清楚知道如何转换了。
如图所示,与C++的虚函数类似,interface保存了两部分内容,一部分是数据类型,另一部分是数据,所以可以被转化为任何数据。[]struct是被当作一个整体看待的,[]struct与struct,或者与int都没区别,表示一种数据类型。[]struct可以转换为interface,但是[]interface表示有一组interface,一个[]struct,当然不可能转化为多个interface,也就不能转化为[]interface。
实际上我们的意思是把[]struct中的每个元素作为独立个体,再对应[]iterface中的每个interface。既然理解到这一层,就可以很好的实现转换了:
// 根据[]struct x的元素个数,创建对应的[]interface y
y := make([]interface{}, len(x))
// 遍历[]struct x中的每个元素,转换为[]interface y中的每个元素
for i, v := range x {
y[i] = v
}
https://go.dev/doc/faq#convert_slice_of_interface
https://research.swtch.com/interfaces
https://stackoverflow.com/questions/44319906/why-golang-struct-array-cannot-be-assigned-to-an-interface-array
post发送的数据接收不到
如图所示,postman发送的方式有很多种,如果gin注册了post路由,那么数据不可以使用params发送,这个不是post的数据。
应该在body中增加post数据,并且如果代码中定义接收数据的结构体是json类型,如下:
type TEST struct {
VALUE string `json:"value" binding:"required"`
}
那么postman发送时,body界面,选择raw(源数据),后面还要选择JSON,默认是TEXT。如果是TEXT,由于content-type不匹配,会收不到数据。
如果boday类型选择form-data或者x-www-form-urlencoded,那么接收的结构体也要设定为对应的类型,增加form类型指定。
type CreateRequest struct {
Username string `json:"username" form:"username"`
Phone string `json:"phone" form:"phone"`
Password string `json:"password" form:"password"`
}
https://stackoverflow.com/questions/53705933/gin-framework-can-not-get-the-data-from-postman