// Person 定义一个人的结构体
type Person struct {
// 姓名
Name string
// 年龄
Age int
// 性别
Sex string
// 身份证号
idNumber string
}
//1、声明一个结构体变量
var person Person
fmt.Println(person.Name) // ""
fmt.Println(person.Age) // 0
fmt.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 = 18
person.Age = 18
fmt.Println(person.Age) // 18
type people struct {
name string
age int
dog //匿名字段
}
在 Go 语言中,使用指针类型可以方便地操作数据和结构体,指针类型通常用于修改和传递数据的引用。下面我们来看一下指针结构体指针赋值的使用和区别。
在 Go 语言中,结构体是值类型,当结构体作为参数传递时,会被复制,如果结构体数据量很大,那么复制的开销就很大,所以通常使用指针类型来传递结构体。在指针类型中,指针指向的是结构体的内存地址,可以通过指针来修改结构体的值。
type Person struct {
Name string
Age 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 语言中是非常常用的,可以用来修改和传递数据的引用,提高代码的效率和可读性。
package main
import "fmt"
type Test struct {
name string
}
func main() {
a := 90
test := &Test{} //这里test是指针
test.name = "小徐"
var p *int
p = &a
fmt.Println(p) //普通变量地址
fmt.Println(test)
fmt.Println(*test)
fmt.Println("---------------")
var t Test
var p2 *Test
p2 = &t
fmt.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 = 666
var numPtr *int = &num
*numPtr = 777
r = &TRes{
Data: numPtr,
}
fmt.Println(r)
fmt.Println(r.Data)
if val, ok := r.Data.(*int); ok {
fmt.Println("val:", *val)
}
return
}