golang中的struct操作

struct是实现面向对象的重要技术,基本上都跟类型声明type name underlying-type结合使用。

struct是值类型,所以它的零值是所有成员的零值。由于值类型在作为函数参数时的局限性,所以经常配合指针一起使用。

声明

type Employee struct {
    ID      int
    Name    string
    Address string
}

一行一个成员,中间没有逗号或分号,大写的成员可以在包外访问。

如果类型相同,也可以考虑定义在一行,例如

type Employee struct {
    ID            int
    Name, Address string
}

结构体中不能定义同名结构体的成员,但可以定义同名结构体的指针类型的成员,例如

type Employee struct {
    ID            int
    Name, Address string
	   Leader        *Employee
}

初始化

可以在声明时直接初始化,也可以声明后再一个个赋值。先看一个最直接的方式。

var empl Employee
empl.ID = 1
empl.Name = "foo"
empl.Address = "nanshan"

还可以更快地初始化

empl2 := Employee{2, "foo", "nanshan"}

所以,声明成员的顺序非常重要。上面初始化的值必须与struct的成员一一对应,不多不少,类型上可赋值。

由于struct成员可能会调整,所以上面的代码就显得有些脆弱,下面改进一下,按照成员名称来初始化。

empl3 := &Employee{
    ID:      3,
    Name:    "foo",
    Address: "beijing",
}

这时候顺序不重要了,也不要求我完整性了,未直接赋值的成员继续保留零值。

与指针相关的操作

由于struct是值类型,如果作为参数传递的话,函数体内接收到的是一个拷贝,所以作为函数的参数时一般用结构体指针来传递。

emplPtr := &empl
emplPtr.Name = "bar" 		// 等同于 (*emplPtr).Name = "bar"

在使用struct指针类型的变量时,可以省略*,看上去就像struct是引用类型一样,其实它是一个结构体指针。

下面的函数初始化一个struct,并返回了它的指针

func EmployeeById(id int) *Employee {
    return &Employee{
        ID:      id,
        Name:    "foo",
        Address: "beijing",
    }
}

struct的可比较性

如果struct的每个成员都是可比较的,那么这个结构体就是可比较的。

比较算法为:如果每个成员的值都相等,则两个结构体变量相等,否则不相等。

如果结构体类型是可比较的,就意味着它可以作为map的key类型。

结构体嵌套和匿名成员

这是一个神奇的机制,当在结构体里面声明一个匿名结构体时,使用这个匿名结构体的成员时,就可以省略匿名结构体的名字,就好像当前的结构体拥有这个匿名结构体的成员一样。

下面的结构体,EmployeeManager,将上面的结构体Employee作为一个匿名成员

type EmployeeManager struct {
    Employee                // 匿名成员
    ManagerLevel int
}

初始化匿名成员:

var manager = EmployeeManager{
    Employee: Employee{
        ID:      2,
        Name:    "fooManager",
        Address: "beijing",
    },
    ManagerLevel: 4,
}

看上去中规中矩,没有什么神奇的。再来看看如何使用这个结构体

fmt.Println(manager.ManagerLevel)
fmt.Println(manager.Name)				//这一行
fmt.Println(manager.Employee.Name)		//等同于这一行

这么折腾,不仅是一种简化,更重要的是,我看出来了继承的味道,但从技术上看又不存在继承,而是组合,它即享受了继承的好处,又避免了继承的麻烦。

使用匿名结构体时,除了可以直接使用它的属性以外,还可以直接使用它的方法。

到此这篇关于golang中的struct的文章就介绍到这了,更多相关golang中struct内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Golang学习笔记(六):struct

    struct struct,一组字段的集合,类似其他语言的class 放弃了大量包括继承在内的面向对象特性,只保留了组合(composition)这个最基础的特性 1.声明及初始化 复制代码 代码如下: type person struct {     name string     age  int } //初始化 func main() {     var P person P.name = "tom"     P.age = 25     fmt.Println(P.name)

  • golang如何使用struct的tag属性的详细介绍

    从一个例子说起 我们经常会碰到下面格式的struct定义: type Person struct { Name string `json:"name"` Age int `json:"age"` } 这个struct定义一个叫做Person的类型,包含两个域Name和Age:但是在域的后面有神奇的 json:"name" ,这个用来干什么用?这篇文章试图来解释这个问题. 当golang的对象需要和json做转换的时候,我们就经常用到这个特性. 有

  • golang中struct和interface的基础使用教程

    前言 本文主要给大家介绍了关于golang中struct和interface的相关内容,是属于golang的基本知识,下面话不多说了,来一起看看详细的介绍吧. struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套:go中的struct类型理解为类,可以定义方法,和函数定义有些许区别:struct类型是值类型. struct定义 type User struct { Name string Age int32 mess string } var user User

  • golang语言如何将interface转为int, string,slice,struct等类型

    在golang中,interface{}允许接纳任意值,int,string,struct,slice等,因此我可以很简单的将值传递到interface{},例如: package main import ( "fmt" ) type User struct{ Name string } func main() { any := User{ Name: "fidding", } test(any) any2 := "fidding" test(a

  • golang中struct和[]byte的相互转换示例

    在网络传输过程中,经常会这样处理:socket接收到数据,先获取其消息头,然后再做各种不同的业务处理.在解析消息头的时候的方法有多种多样.其中最为高效解析消息头的方法就是直接把数据头部分强制类型转换为对应的消息头结构体.这种做法在C/C++中非常的常见.而golang其实也是可以这样子做的.类似这样的应用,直接类型转换获取消息对应的解析方法其实效率会相对较高. golang中struct和[]byte的转换方法,其实就是用到了golang中的unsafe包加上类型转换 , 约束:struct中不

  • golang中的struct操作

    struct是实现面向对象的重要技术,基本上都跟类型声明type name underlying-type结合使用. struct是值类型,所以它的零值是所有成员的零值.由于值类型在作为函数参数时的局限性,所以经常配合指针一起使用. 声明 type Employee struct { ID int Name string Address string } 一行一个成员,中间没有逗号或分号,大写的成员可以在包外访问. 如果类型相同,也可以考虑定义在一行,例如 type Employee struc

  • Golang中interface{}转为数组的操作

    interface{} 转为普通类型 我们都知道在golang中interface{}可以代表任何类型,对于像int64.bool.string等这些简单类型,interface{}类型转为这些简单类型时,直接使用 p, ok := t.(bool) p, ok := t.(int64) 如果ok==true的话,就已经类型转换成功. 假设有这样一个场景,我们有一个函数有返回值,但是返回值的类型不定,所以我们的返回值类型只能以接口来代替了. 返回接口类型之后,我们就要对其类型进行判断然后进行类型

  • golang中json操作的完全指南

    目录 前言 1. 结构体与JSON互转 2. map与JSON互转 3. 结构体的变量不加tag标签能否正常转成json数据 4. JSON操作的一些小技巧 (1)忽略掉 struct 指定字段 (2)添加额外的字段 (3)合并两个 struct (4)字符串传递给 int类型 (5)一个 json 分成两个struct 补充:GoLang json格式化输出 总结 前言 JSON是一种轻量级的数据交换格式.易于阅读和编写. golang 提供了 encoding/json 包来操作JSON数据

  • 在golang中操作mysql数据库的实现代码

    前言 Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能: •sql.DB 通过数据库驱动为我们提供管理底层数据库连接的打开和关闭操作. •sql.DB 为我们管理数据库连接池 需要注意的是,sql.DB表示操作数据库的抽象访问接口,而非一个数据库连接对象;它可以根据driver打开关闭数据库连接,管理连接池.正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用.所以,如果你没有把连接释放回连接池,

  • 详解Golang中的各种时间操作

    需求 时间格式的转换比较麻烦,自己写了个工具,可以通过工具中的这些方法相互调用转成自己想要的格式,代码如下,后续有新的函数再添加 实现代码 package utils import "time" const ( TIMEFORMAT = "20060102150405" NORMALTIMEFORMAT = "2006-01-02 15:04:05" ) // 当前时间 func GetTime() time.Time{ return time.

  • golang中json小谈之字符串转浮点数的操作

    有时会有这种需求,将一个json数据形如: {"x":"golang", "y":"520.1314"} 中的y反序列化为浮点类型,如果这样写: package main import ( "encoding/json" "fmt" ) type JsonTest struct { X string `json:"x"` Y float64 `json:"y

  • golang中日期操作之日期格式化及日期转换

    golang中并没有像java一样提供类似yyyy-MM-dd HH:mm:ss格式的操作,而是将其定义为golang的诞生时间: 2006-01-02 15:04:05 -0700 MST 注意这在golang的日期格式化里不是一个具体日期,而是格式,这样如果我们需要格式化日期,可以如下操作 timeNow := time.Now() fmt.Println("yyyy-MM-dd HH:mm:ss" ,timeNow.Format("2006-01-02 15:04:05

  • Golang中struct{}和struct{}{}的区别解析

    目录 struct {} struct {} {} 使用场景举例 首先说下Golang中的结构体,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,Golang中使用关键字struct来创建一个结构体,语法如下: typeStudentstruct { Name string } 下面定义一个Student结构体,例如: typeStudentstruct { name string } 然后声明一个Student类型的变量并赋值 var stu Student stu.name =

随机推荐