Go语言中结构体初始化后,拿到结构体类型的普通对象(非指针类型),调用其地址传递的方法后,居然仍然能实现增加和删除?不理解

Go语言结构体到底是什么传递

本周,拿go练习了数据结构中的单链队列,实现很简单,代码附在最后。
然而在测试到时候惊奇的发现,在InitQ函数中,我明明返回的是LinkQ类型,并没有在这个返回值设置对应的指针类型,而在main函数测试中,我反而拿这个LinkQ类型变量去调用了AddQ方法,而且居然还生效了,注意我AddQ的调用者设置的是指针类型(**LinkQ),

因为我们知道,Go语言中结构体是值传递,所以要想做改变其中成员操作的方法和函数参数,必然要做地址传递。
*

package main

import "fmt"
//实现单链队列,队尾入队,队头出队

//定义队列每个节点属性
type Qnode struct {
    data interface{}
    next *Qnode
}
//定义队列属性
type LinkQ struct{
    head *Qnode //头指针
    length int
}
func InitQ()_** LinkQ**_{
    return LinkQ{
        &Qnode{
            0,
            nil,
        },
        0,
    }
}
func InitQnode(i interface{})*Qnode{
    return &Qnode{
        i,
        nil,
    }
}
func (q *LinkQ)AddQ(node *Qnode)bool{
    p:=q.head
    for i:=0;i<q.length;i++{
            p=p.next
    }
    node.next=p.next
    p.next=node
    q.length++
    return true
}
func (q *LinkQ)DelQ()bool{
    if q.length==0 {
        fmt.Println("队是空队列,无法删除")
        return false
    }
    p:=q.head.next
    q.head.next=p.next
    p.next=nil
    q.length--
    return true
}
func(q LinkQ)Show()string{
    if q.length==0{
        return "表是空的"
    }
    p:=q.head.next
    for i:=0;i<q.length;i++{
        fmt.Printf("%v",p.data)
        p=p.next
    }
    return "打印完毕"
}
func main() {
   **//初始化队列,注意这里q应该只是LinkQ类型**
    q:=InitQ()
    //往队列里插入数据
    for i:=0;i<7;i++{
        n:=InitQnode(i)
    **  //居然可以调用AddQ并且生效了**
        q.AddQ(n)
    }
    fmt.Println(q.Show())
    q.DelQ()
    q.DelQ()
    q.DelQ()
    fmt.Println(q.Show())
}
结果:
0123456打印完毕
3456打印完毕