type Info struct {
	ID []int `form:"id"`
}
func BindForm(c *gin.Context) error {
	var info Info
	err:=c.ShouldBind(&info)
	if err!=nil{
		return err
	}
	return nil
}

当是用gin框架绑定提交参数的时候 (github.com/gin-gonic/gin v1.6.3)

以form形式提交的时候gin目前只能匹配id=1&id=2&id=3的数组形式

不行识别id[0]=1&id[1]=2&id[2]=3和id[]=1&id[]=2&id[]=3的形式

前端可以设置qs参数将数组转换成id=1&id=2&id=3的形式

qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })
// 'a[0]=b&a[1]=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })
// 'a[]=b&a[]=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })
// 'a=b&a=c'

以application/json的形式提交时可以正常匹配数组



package main

import "fmt"

type User struct {
	Id   int
	Name string
}

func main() {
	user := new(User)
	//当传递指针使用函数赋值时 必须对指针指向的值进行赋值
	getUser(user)
	fmt.Println(user)

	//当不用函数调用时一般不需要太过注意,但是也要清楚原理
	user2 := &User{
		Id:   2,
		Name: "小红",
	}
	//复制指针
	user = user2
	//复制指针指向的值
	*user = *user2
	fmt.Println(user)
}
func getUser(user *User) {
	//错误方式
	user = &User{
		Id:   1,
		Name: "小明",
	}
	//正确方式
	*user = User{
		Id:   1,
		Name: "小明",
	}

	//错误方式
	user2 := &User{
		Id:   1,
		Name: "小明",
	}
	user = user2
	//正确方式
	user2 = &User{
		Id:   1,
		Name: "小明",
	}
	*user = *user2
}


go 切片变量其实相当于一个指针 保存的地址是切片第一个元素的地址

package main

import "fmt"

func main() {
	a := make([]int8, 0)
	fmt.Printf("%p\n", a)
	a = append(a, 1, 2)
	fmt.Printf("%p\n", a)
	fmt.Println(&a[0])
	fmt.Println(&a[1])
}

输出内容

0xbec578
0xc00000a0b8
0xc00000a0b8
0xc00000a0b9