golang 结构体入门

文章发布于 2023-08-28

golang 结构体,使用关键字type 定义,struct是结构体类型。在golang中没有class 类。结构体就是golang 的面向对象。结构体的字段可以是基本数据类型、数组、切片、映射、通道、结构体本身等。

定义

type structname struct {
    field dataType
    field dataType
}
  • type 定义结构体

  • structname 结构体名称

  • struct 结构体类型

实例化结构体

第一种实例化结构体,直接实例化并赋值

//定义结构体
type person struct {
    name string
    age int
}

//实例化结构体
personObj := person {
    name:"zhang"
    age: 22
}

//访问结构体的属性
personObj.name

第二种实例化结构体,先声明一个变量,变量类型是person结构体,再对变量赋值。

//变量
var personObj person
//赋值
personObj.name = "zhang"
personObj.age = 22

第三种实例化结构体,使用New

personObj := New(person)
personObj.name="zhang"
personObj.age = 22

第四种实例化结构体,使用指针&

personObj := &person{}
personObj.name="zhang"
personObj.age=22

指针结构体

实例化指针结构体有两种方法。new& ,这两种方式实例化的结构体都是指针完成的。

new实例化结构体

//定义一个s的结构体
type s struct {
    name string
}

//new实现结构体
var a *s = new(s)
(*a).name = "zhangsan"
fmt.Println(a.name)

& 实例化结构体

var a *s = &s{}
(*a).name = "zhangsan"
fmt.Println(a.name)

空指针

var a *s //创建一个空的结构体,指针指向了空
a = new(s)  // 需要重新赋值给一个结构体
*a.name="zhang"
fmt.Println(a.name)

嵌套结构体

在结构体中,字段也可以是匿名的,这意味着你可以直接访问嵌套结构体的字段,而不需要通过结构体名进行访问。

type Address struct {
    Street string
    City   string
}

type Person struct {
    FirstName string
    LastName  string
    Age       int
    Address   // 匿名字段
}
func main() {
    p := Person{
        FirstName: "Alice",
        LastName:  "Doe",
        Age:       28,
        Address: Address{
            Street: "456 Park Ave",
            City:   "Townsville",
        },
    }
    fmt.Println(p.Street) // 直接访问嵌套结构体的字段
}

结构体方法

谁实例化了结构体,谁就拥有结构体定义的方法。

type Person struct {
    name string
}

//定义结构体方法
func (c Person) Say(msg string) {	
    fmt.Println(msg)
}

// person结构体实现了一个Say的方法,如果要使用Say方法,则实例化Person结构体即可。
p := Person{
    name: "zhangsan",
}
fmt.Println(p)
p.Say("hello ,i am p")

为什么使用结构体指针

如果在其他地方需要修改结构体的值,那么就需要使用指针,如果不使用指针是无法修改。

type Person2 struct {
    name string
}

func setName(p Person2, val string) {
    //不使用指针,此时的p和外部的结构无关系
    p.name = val
}

func main(){
    var p = Person2{}
    p.name = "zhangsan" 
    fmt.Println(p.name) //zhangsan
    setName(p, "sss")
    fmt.Println(p.name)  //zhangsan
}

下面修改成指针结构体之后

type Person2 struct {
    name string
}
func setName(p Person2, val string) {
    p.name = val
}
//使用指针,将按址修改
func setName2(p *Person2, val string) {
    p.name = val
}
func main(){
    //指针结构体的创建方法。
    var p = &Person2{}
    p.name = "sss"
    fmt.Println(p.name)
    setName2(p, "s1")
    fmt.Println(p.name) // s1
    fmt.Println(*p.name) // s1
    //上面的*p 和p 是一个意思,go会将p自动转换为*p
}

实例

使用结构体表示学生信息的一个简单实例。

package main

import "fmt"

type Student struct {
    ID     int
    Name   string
    Age    int
    Gender string
}

func main() {
    student := Student{
        ID:     123,
        Name:   "Alice",
        Age:    20,
        Gender: "female",
    }

    fmt.Printf("ID: %d\nName: %s\nAge: %d\nGender: %s\n",
        student.ID, student.Name, student.Age, student.Gender)
}

在这个示例中,我们定义了一个 Student 结构体,包含了学生的 ID、姓名、年龄和性别。然后我们创建了一个 student 实例,并打印了学生的信息。它演示了如何定义、实例化和使用结构体来表示复杂的数据类型。