go学习笔记

2023-12-20 18:45:55

指针使用

// 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 语言中,使用指针类型可以方便地操作数据和结构体,指针类型通常用于修改和传递数据的引用。下面我们来看一下指针结构体指针赋值的使用和区别。
在 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 语言中是非常常用的,可以用来修改和传递数据的引用,提高代码的效率和可读性。

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
}

文章来源:https://blog.csdn.net/u014617119/article/details/135113308
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。