指针使用
// Person 定义一个人的结构体
type Person struct {// 姓名Name string// 年龄Age int// 性别Sex string// 身份证号idNumber string
}//1、声明一个结构体变量var person Personfmt.Println(person.Name) // ""fmt.Println(person.Age) // 0fmt.Println(person.Sex) // ""fmt.Println(person.idNumber) // ""// 修改结构体字段的值person.Name = "chenmingyong"fmt.Println(person.Name) // "chenmingyong"//2、使用复合字面值进行显式初始化结构体对象person := Person{"chenmingyong",18,"男","xxxxxxxxx",}fmt.Println(person)//3、 使用 field:value 形式的复合字面值进行显式初始化结构体对象 person := Person{Sex: "男",Age: 18,Name: "chenmingyong",idNumber: "xxxxxxxxx",}
//4、通过 new(T) 函数创建结构体指针fmt.Println(person) // {chenmingyong 18 男 xxxxxxxxx}person := new(Person)(*person).Name = "chenmignyong"fmt.Println((*person).Name) // chenmignyong// 简化赋值,底层自动转换成 (*person).Age = 18person.Age = 18fmt.Println(person.Age) // 18
结构体使用匿名字段
type people struct {name stringage intdog //匿名字段}
go 指针结构体指针赋值的使用和区别
在 Go 语言中,使用指针类型可以方便地操作数据和结构体,指针类型通常用于修改和传递数据的引用。下面我们来看一下指针结构体指针赋值的使用和区别。
在 Go 语言中,结构体是值类型,当结构体作为参数传递时,会被复制,如果结构体数据量很大,那么复制的开销就很大,所以通常使用指针类型来传递结构体。在指针类型中,指针指向的是结构体的内存地址,可以通过指针来修改结构体的值。
type Person struct {Name stringAge int
}func main() {p := &Person{"Tom", 18} // 创建一个 Person 类型的指针fmt.Println(*p) // 输出:{Tom 18}p.Name = "Jerry" // 通过指针修改 Name 字段的值p.Age = 20 // 通过指针修改 Age 字段的值fmt.Println(*p) // 输出:{Jerry 20}p2 := new(Person) // 使用 new 函数创建一个 Person 类型的指针p2.Name = "Lucy" // 通过指针修改 Name 字段的值p2.Age = 22 // 通过指针修改 Age 字段的值fmt.Println(*p2) // 输出:{Lucy 22}
}
在上面的示例中,我们首先创建了一个指向 Person 类型的指针,然后通过指针修改了结构体的值,接着使用 new 函数创建了一个 Person 类型的指针,通过指针修改了结构体的值。
总之,指针类型在 Go 语言中是非常常用的,可以用来修改和传递数据的引用,提高代码的效率和可读性。
Go结构体地址与普通变量地址
package mainimport "fmt"type Test struct {name string
}func main() {a := 90test := &Test{} //这里test是指针test.name = "小徐"var p *intp = &afmt.Println(p) //普通变量地址fmt.Println(test)fmt.Println(*test)fmt.Println("---------------")var t Testvar p2 *Testp2 = &tfmt.Println(t)fmt.Println(&t) //取结构体地址fmt.Println(p2)fmt.Println(*p2)fmt.Println("---------------")
} //结果:
0xc00000a0c0
&{小徐}
{小徐}
---------------
{}
&{}
&{}
{}
---------------
打印结构体里面的指针的值
type TRes struct {Data interface{} `json:"data"`
}func (c *MemberController) Test(ctx context.Context, req *TestReq) (r *TRes, err error) {var num int = 666var numPtr *int = &num*numPtr = 777r = &TRes{Data: numPtr,}fmt.Println(r)fmt.Println(r.Data)if val, ok := r.Data.(*int); ok {fmt.Println("val:", *val)}return
}