• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

无信不立

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【go语言】结构体

一、结构体整体说明

Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型

Go 语言中的类型可以被实例化,使用new或&构造的类型实例的类型是类型的指针

结构体成员是由一系列的成员变量构成,这些成员变量也被称为“字段”。字段有以下特性:

  • 字段拥有自己的类型和值。
  • 字段名必须唯一。
  • 字段的类型也可以是结构体,甚至是字段所在结构体的类型。

 

关于 Go 语言的类(class)

  • Go 语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。
  • Go 语言的结构体与“类”都是复合结构体,但 Go 语言中结构体的内嵌配合接口比面向对象具有更高的扩展性和灵活性。
  • Go 语言不仅认为结构体能拥有方法,且每种自定义类型也可以拥有自己的方法。

 

二、结构体声明和实例化

1、声明一个结构体

type 类型名 struct {
    字段1 字段1类型
    字段2 字段2类型
    …
}

2、实例化一个结构体

2.1、基本实例化形式

var ins T

其中,T 为结构体类型,ins 为结构体的实例。

 

type Point struct {
    X int
    Y int
}
var p Point
p.X = 10
p.Y = 20

2.2、创建指针类型的结构体

ins := new(T)

其中:
T 为类型,可以是结构体、整型、字符串等。
ins:T 类型被实例化后保存到 ins 变量中,ins 的类型为 *T,属于指针。
type Player struct{
    Name string
    HealthPoint int
    MagicPoint int
}
tank := new(Player)
tank.Name = "Canon"
tank.HealthPoint = 300

2.3、取结构体的地址实例化

在Go语言中,对结构体进行&取地址操作时,视为对该类型进行一次 new 的实例化操作,取地址格式如下:
ins := &T{}

其中:
  • T 表示结构体类型。
  • ins 为结构体的实例,类型为 *T,是指针类型。
type Command struct {
    Name    string    // 指令名称
    Var     *int      // 指令绑定的变量
    Comment string    // 指令的注释
}
var version int = 1
cmd := &Command{}
cmd.Name = "version"
cmd.Var = &version
cmd.Comment = "show version"
取地址实例化是最广泛的一种结构体实例化方式,可以使用函数封装上面的初始化过程,代码如下:

func newCommand(name string, varref *int, comment string) *Command {
    return &Command{
        Name:    name,
        Var:     varref,
        Comment: comment,
    }
}
cmd = newCommand(
    "version",
    &version,
    "show version",
)

三、初始化结构体的成员变量

3.1、使用“键值对”初始化结构体

3.1.1、书写格式

ins := 结构体类型名{
    字段1: 字段1的值,
    字段2: 字段2的值,
    …
}

下面是对各个部分的说明:
  • 结构体类型:定义结构体时的类型名称。
  • 字段1、字段2:结构体成员的字段名,结构体类型名的字段初始化列表中,字段名只能出现一次。
  • 字段1的值、字段2的值:结构体成员字段的初始值。

键值之间以:分隔,键值对之间以,分隔。

3.1.2、案例

type People struct {
    name  string
    child *People
}
relation := &People{
    name: "爷爷",
    child: &People{
        name: "爸爸",
        child: &People{
                name: "我",
        },
    },
}

3.2、使用多个值的列表初始化结构体

3.2.1、书写格式

ins := 结构体类型名{
    字段1的值,
    字段2的值,
    …
}

使用这种格式初始化时,需要注意:
  • 必须初始化结构体的所有字段。
  • 每一个初始值的填充顺序必须与字段在结构体中的声明顺序一致。
  • 键值对与值列表的初始化形式不能混用
 

3.2.2、案例

type Address struct {
    Province    string
    City        string
    ZipCode     int
    PhoneNumber string
}
addr := Address{
    "四川",
    "成都",
    610000,
    "0",
}
fmt.Println(addr)

3.3、初始化匿名结构体

3.3.1、书写格式

ins := struct {
    // 匿名结构体字段定义
    字段1 字段类型1
    字段2 字段类型2
    …
}{
    // 字段值初始化
    初始化字段1: 字段1的值,
    初始化字段2: 字段2的值,
    …
}


下面是对各个部分的说明:
字段1、字段2……:结构体定义的字段名。
初始化字段1、初始化字段2……:结构体初始化时的字段名,可选择性地对字段初始化。
字段类型1、字段类型2……:结构体定义字段的类型。
字段1的值、字段2的值……:结构体初始化字段的初始值。



键值对初始化部分是可选的,不初始化成员时,匿名结构体的格式变为:
ins := struct {
    字段1 字段类型1
    字段2 字段类型2
    …
}

 

3.3.2、案例

package main
import (
    "fmt"
)
// 打印消息类型, 传入匿名结构体
func printMsgType(msg *struct {
    id   int
    data string
}) {
    // 使用动词%T打印msg的类型
    fmt.Printf("%T\n", msg)
}
func main() {
    // 实例化一个匿名结构体
    msg := &struct {  // 定义部分
        id   int
        data string
    }{  // 值初始化部分
        1024,
        "hello",
    }
    printMsgType(msg)
}

 

posted on 2025-02-23 15:36  无信不立  阅读(15)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3