GO语言学习系列九——GO的结构(struct)与方法(method)

golang struct 实现 interface的方法 主要介绍了golang struct 实现 interface的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 立即下载

转载:作者:checklin
链接:https://www.jianshu.com/p/863c270f8328

说明:前面两个输出已经介绍过,我们重点来说下调用t.Add()以及输出
我们在上面可以看出,新增了一个变种函数(其实是方法),(t *T) 这就是给这个结构体绑定函数,然后在结构体中就可以直接调用Add这个方法,GO就是以这种形式来实现面像对象的思想

结构(struct)

由于在GO中没有class的关键字,也就是其它语言经常在面向对象中使用的方面,但GO是通过struct结构与method方法组合来实现的面向对象概率,所以在GO中,结构是非常重要的一种语法类型
在定义结构体时,和map等语言类型非常像似

var 结构变量 struct{
    字段1 字段1类型
    字段2 字段2类型
    ...
}

一个例子,简单介绍写定义与使用结构

package main
import (
    "fmt"
)
type T struct {
    Name string
    Age  int
}
func main() {
    t := T{}
    fmt.Println(t)
    t.Name = "astar"
    t.Age = 10
    fmt.Println(t)
}

输出:

{ 0}
{astar 10}

说明:
在初始化接收时,没有给结构中的字段赋值,这些字段都是有默认值,比如int型为0,string为nil,等等(之前有介绍过),初始化后,就可以通过.的方式来给结构中的字段赋值,这是不是非常像其它语言中的面相对象呢?

由于在GO中传值也是拷贝的方式(可以自行验证,比如,写一个方法,然后把这个结构传到这个方法,在方法中改变这个结构中的某个字段,在打印出来看是否进行了更改,在按指针传递测试一下,就可以得出),所以在上面的例子中也可以这样
t := &T{} ,直接接收指针,在将这个变量传递到其它地方,都是引用传递

实现一个简单的构造工厂

type File struct {
    fd      int     // 文件描述符
    name    string  // 文件名
}
func NewFile(fd int, name string) *File {
    if fd < 0 {
        return nil
    }
    return &File{fd, name}
}

调用:

f := NewFile(10, "./test.txt")

GO语言中,结构struct的形式还有很多种,比如定义时可以在类型后面加title,可以用匿名等,在接收时可以直接进行赋值等一系列非常灵活的用法,如果在实际使用中遇见了不要惊讶

方法(method)

在GO语言中,结构体就像一种类的简单形式,类里的变量就像是结构体中的体中的字段一样,那类里的方法呢,在GO中是怎么定义与使用的?
GO的方法是下定义在一个接收者上的一个函数,接收者是某种类型的变量;
GO的方法其实就是一个变种的函数

func (接收者) 函数名... 正常的函数结构

结合上面的结构,我们来定义方法,其实就是一个最基本的面向对象的雏形

package main
import (
    "fmt"
)
type T struct {
    Name string
    Age  int
}
func main() {
    t := T{}
    fmt.Println(t)
    t.Name = "astar"
    t.Age = 10
    fmt.Println(t)
    t.Add()
}
func (t *T) Add() {
    fmt.Println(t.Age, t.Name)
}

输出为:

{ 0}
{astar 10}
10 astar

说明:前面两个输出已经介绍过,我们重点来说下调用t.Add()以及输出
我们在上面可以看出,新增了一个变种函数(其实是方法),(t *T) 这就是给这个结构体绑定函数,然后在结构体中就可以直接调用Add这个方法,GO就是以这种形式来实现面像对象的思想

如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
类型别名不会拥有底层类型所附带的方法
方法可以调用结构中的非公开字段



ps:相关结构体函数 参考

https://www.cnblogs.com/mikeluwen/p/7592824.html

 

https://studygolang.com/articles/15240?fr=sidebar

// code_017_struct_method_usage project main.go
package main

import (
    "fmt"
)

type MyInt int

func (a MyInt) Add(b MyInt) MyInt {
    return a + b
}

func Add(a, b MyInt) MyInt {
    return a + b
}

type Person struct {
    name string
    sex  byte
    age  int
}

func (p Person) PrintInfo() {
    fmt.Println(p.name, p.age)
}

func (p *Person) SetInfoPointer() {
    (*p).name = "god_girl"
    p.sex = 1
    p.age = 22
}

func (p Person) SetInfoValue() {
    p.name = "god_like"
    p.sex = 1
    p.age = 23
}

func main() {
    /*
        带有接收者的函数,我们称之为方法(method).本质上,一个方法则是一个和特殊类型关联的函数。
        func (receiver ReceiverType) funcName(parameters){results}
        1)参数 receiver 可任意命名。如方法中未曾使用,可省略参数名。
        参数 receiver 类型可以是 T 或 *T。基类型 T 不能是接口或指针。
        不支持重载方法,也就是说,不能定义名字相同但是不同参数的方法。
        2)在Go语言中,可以给任意自定义类型(包括内置类型,但不包括指针类型)添加相应的方法。

    */
    //1) 基本使用
    var a MyInt = 1
    var b MyInt = 1

    fmt.Println("a.Add(b)=", a.Add(b))
    fmt.Println("Add(a,b)=", Add(a, b))
    //2)结构体作为接收者
    p := Person{"ck_god", 0, 18}
    p.PrintInfo()

    //3)结构体的值语义和引用语义

    p1 := Person{"wanglaoji", 0, 27}
    fmt.Println("函数调用前= ", p1)
    (&p1).SetInfoPointer()
    fmt.Println("函数调用后=", p1)

    fmt.Println("==========================")
    p2 := Person{"ck_god", 0, 18}
    fmt.Println("函数调用前 = ", p2)
    p2.SetInfoValue()
    fmt.Println("函数调用后 = ", p2) //函数调用后 =  {mike 109 18}

}
【时序列】时序列数据如何一步步分解成趋势(trend)季节性(seasonality)和误差(residual)- 详细理解python sm.tsa.seasonal_decompose 【时序列】时序列数据如何一步步分解成趋势(trend)季节性(seasonality)和误差(residual)- 详细理解python sm.tsa.seasonal_decompose 在做时序列分析的时候,好多教程都告诉你要把时序列分解成趋势,季节性,残差,然后画图看一下有没有趋势变化,有没有季节性。像这样: import statsmodels.api as sm decomposition = sm.tsa.seasonal_decompose(train['Count'] ,model='add 阅读详情

相关推荐

GDSFactory环境配置实战:Python、KLayout与PDK协同指南

GDSFactory是面向光子集成电路(PIC)设计的Python参数化建模框架,其核心价值在于将版图生成从手动绘图升维为可编程、可复现、可集成CI/CD的工程实践。它依赖Python科学计算生态(如NumPy)、EDA可视化工具KLayout的深度Python绑定,以及工艺厂PDK的标准化接入,三者构成‘计算-几何-工艺’技术闭环。典型应用场景包括教学级SiEPIC PDK快速原型、工业级AIM Photonics流片准备,以及自动化DRC与光学仿真流水线构建。本文聚焦GDSFactory落地中最关键也最

weixin_30983353的博客 369

13 Go语言——Struct和Method

Go语言——Struct 和Method 文章目录Go语言——Struct 和Method一、结构体struct1、struct介绍2、struct 定义和初始化3、结构体比较4、匿名字段3、结构体嵌入二、Method1、方法声名2、值接收者和指针接收者2.3 使用值调用值接收者方法2.4 使用指针调用指针接收者方法2.5 使用指针调用值接收者方法2.6 使用值调用指针接收者方法3、匿名字段3、M...

小人物、平凡,世界很大我只想在家 581

别再只当代码阅读器了!手把手教你用Understand的实体定位器和信息浏览器,5分钟精准定位代码逻辑

本文深入解析Understand代码分析工具的高级功能,重点介绍实体定位器和信息浏览器的实战应用。通过5分钟快速定位代码逻辑的技巧,帮助开发者从代码阅读者升级为逻辑侦探,提升大型代码库的分析效率。文章包含过滤搜索、调用链追踪等实用方法,是掌握Understand核心功能的必备指南。

weixin_28745821的博客 292

Golang深入浅出之-Go语言结构体(struct)入门:定义与使用

Age intAddress Address // 内嵌结构体Zip string上述代码定义了一个名为Person的结构体,包含Name(字符串类型)、Age(整型)两个字段,以及内嵌的Address结构体。结构体的定义简洁明了,字段间以逗号分隔,类型紧跟字段名。常见问题与避免方法问题1:未初始化的结构体字段默认值Go语言结构体的字段如果没有显式初始化,其默认值取决于字段类型。对于数值类型,如intfloat64等,默认为零值;对于字符串类型,默认为空字符串;

zevjay的博客 2000

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3338

基于YOLOv11的无人机目标检测系统:实现drone、bird、aircraft多类别识别

采用改进的YOLOv11网络结构,平衡检测精度和速度融合VisDrone和UAVDT数据集,增强模型泛化能力设计多尺度特征融合模块,提升小目标检测性能开发直观的UI界面,便于实际部署和应用。

YOLO 325

10 分钟搞定 Golang 结构体

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。本文详细介绍了 Golang 结构体(Struct)的 7 种高级技巧,包括嵌入、标签、未导出字段、方法定义、结构文字、空结构体和内存对齐,以帮助开发者编写更高效和可维护的 Go 代码。通过使用未导出字段并提供访问和修改方法,可以创建更健壮、更易于维护的代码,并遵守封装原则。

残星说梦话 1037

Python 爬虫实战:在丁香医生抓取健康科普文章阅读量,普及健康知识

requests:用于发送 HTTP 请求,获取网页内容。或 lxml:用于解析 HTML 页面,提取目标数据。pandas:用于数据清洗和分析。matplotlib和seaborn:用于数据可视化。通过本项目,我们实现了以下目标:使用 Python 爬虫抓取丁香医生的健康科普文章阅读量。对数据进行清洗和分析,找出热门文章。通过可视化展示数据,并普及健康知识。

u014481728的博客 1567

golang struct(结构体)详解一

golang struct(结构体)详解一

grb123的博客 2085

VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用(启动SolidWorks代码/直接驱动模型代码/路径下模型驱动代码/创建两个文

VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用(启动SolidWorks代码/直接驱动模型代码/路径下模型驱动代码/创建两个文件夹对话框代码/重新生成三维图代码/导出工程图代码)之详细攻略 目录 基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的案例应用 1、调用SW的模型,并进行参数修改 1.1、VB按钮之SW的三维零件之间切换思想 1.2、调用SW 2、基础案例经验 2.1、设计SW的拉

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 3037

【STK】手把手教你利用STK进行仿真-STK软件简介02 STK专业分析模块

STK/Astrogator是一个交互式轨道机动和深空探测计划工具,用于飞行器运行及任务分析,通过定义推力模型、目标星历、飞行器姿态,提供轨道机动的解决及优化方案。应用Astrogator分析轨道机动的可见性和地面站覆盖,用户可以快速、方便地进行全局分析。任务控制序列保存在STK场景中,用于任务运行、快速制定精确轨道机动方案。为在轨运行的飞行器制定或执行机动计划时,分析人员可以根据飞行过程数据,如发动机定标参数、实际初始轨道,计算出推进器点火和点火时机数据,用于发出指令及精炼机动计划。

weixin_44184852的博客 1864

golang-基础知识(struct)

例子中我们定义了两个匿名字段,一个是结构体person,一个是内置类型int(所有的类型包括内置类型都可以作为匿名字段),对于结构体person,我们可以像访问自己所有的字段一样来访问。1. 通过var p person的方式,然后再通过p.field = value的方式一个一个赋值,其中filed表示我们在struct中定义的字段名。和C语言类似,golang也支持定义新的类型--结构体,结构体由一系列相同或者不同类型的数据构成的数据集合,定义了一个结构体。其中有若干个成员,每个成员又有自己的类型。

wuh2333的博客 582

MICCAI‘23 | TSegFormer:基于几何引导Transformer的口内扫描3D牙齿分割

光学口内扫描仪(IOS)在数字牙科中广泛应用于提供牙冠和牙龈的详细3D信息。准确的3D牙齿分割对于各种牙科应用至关重要,但现有方法在复杂边界处容易出错,并且在不同患者之间表现不佳。本文提出了TSegFormer,它通过多任务3D Transformer架构捕捉IOS点云中不同牙齿和牙龈之间的局部和全局依赖关系。此外,作者设计了一种基于新颖点曲率的几何引导损失,以端到端方式优化边界,避免了耗时的后处理,从而实现临床适用的分割。

小白学视觉 291

GO的结构(struct)与方法(method)

1、结构(struct) 由于在GO中没有class的关键字,也就是其它语言经常在面向对象中使用的方面,但GO是通过struct结构与method方法组合来实现的面向对象概率,所以在GO中,结构是非常重要的一种语法类型 在定义结构体时,和map等语言类型非常像似 var 结构变量 struct{ 字段1 字段1类型 字段2 字段2类型 ... } 一个例子,简单介绍写定义...

BigData_Mining的博客 1997

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【go从零单排】go中的结构体struct和method

在Go语言中,结构体(struct)是一种用户定义的数据类型,用于将相关的数据组合在一起。结构体可以包含多个字段,每个字段可以具有不同的数据类型。结构体是Go语言中组织和管理数据的基本方式之一。

qq_42476938的博客 401

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

13 Go语言——Struct 和Method

Go语言——Struct 和Method [TOC] struct 特点 使用 type &lt;Name&gt; struct{} 定义结构,名称遵循可见性规则 struct是值类型 可以使用字面值对结构进行初始化 支持匿名结构,和匿名字段 允许直接通过指针来读写结构成员 相同类型的成员可进行直接拷贝赋值,支持 == 与 !=比较运...

weixin_33825683的博客 160

go 类型 变量 同名_Go 语言学习之 method

01概念method 和函数类似,只是在函数名字前面多了一个参数,这个参数把这个 method 绑定到这个参数对应的类型上。函数名字前面多的这个参数,我们称之为 method 的接收者,接收者名字最好能够选择简短且在整个 method 中名称始终保持一致的名字。通常的做法是取类型名字的首字母作为接收者名字。因为 method 和成员变量的字段同属于一个命名空间,所以在 struct 类型...

weixin_36036925的博客 222

go结构体(struct)和方法(method)

结构体(struct) go中没有对象这一概念,所以采用了结构体的概念,结构体在go中有着非常重要的位置。结构体是值类型,所以可以使用new函数来创建。结构体中字段必须唯一。 结构体定义如下: type identifier struct { filed type filed type } filed就是结构体的字段名字,type是字段的类型,如果暂时不知道命名,可以使用 _ 来...

旱鸭子 2594

Go 语言学习之 method

method 和函数类似,只是在函数名字前面多了一个参数,这个参数把这个 method 绑定到这个参数对应的类型上。函数名字前面多的这个参数,我们称之为 method 的接收者,接收者名字最好能够选择简短且在整个 method 中名称始终保持一致的名字。通常的做法是取类型名字的首字母作为接收者名字。因为 method 和成员变量的字段同属于一个命名空间,所以在 struct 类型中成员变量的字段名不能和 method 名字相同。否则会报编译错误。

As_wind_的博客 376

【Rust自学】5.3. struct的方法(Method)

一文搞定struct的方法Method

A Rookie in San Domenico School 1475

Golang语言学习从入门到实战----结构体以及内存分布

1.Golang语言面向对象编程说明 Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。 Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现OOP特性的。 Golang面向对象编程非常...

普通Gopher 1148

GO入门——6. struct与方法

1 struct Go 中的struct与C中的struct非常相似,并且Go没有class 使用 type struct{} 定义结构,名称遵循可见性规则 支持指向自身的指针类型成员 支持匿名结构,可用作成员或定义成员变量 匿名结构也可以用于map的值 可以使用字面值对结构进行初始化 允许直接通过指针来读写结构成员 相同类型的成员可进行直接拷贝赋值 支持 == 与 !=比较运算符,...

diekuangzhen0210的博客 153

Go语言学习笔记(八)------结构(struct)与方法(method)

一、结构体定义 1.Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型。结构体也是值类型,因此可以通过 new 函数来创建。组成结构体类型的那些数据称为字段(fields)。每个字段都有一个类型和一个名字;在一个结构体中,字段名字必须是唯一的。结构体定义的一般方式如下: type identifier struct { field1 type1 fi...

Rcvisual的博客 686

Go语言学习笔记(四)结构体struct & 接口Interface & 反射

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型。 struct定义 type User struct { Name string A

linux12a的博客 437

GO学习笔记——结构体、方法、接口

3)一个自定义接口只有实现了接口,才能将该自定义类型的实例赋值给接口类型4)一个自定义类型可以实现多个接口5)一个接口可以继承多个别的接口,但是一个自定义类型要实现该接口时,不仅要实现该接口的方法,还要实现所有它继承的接口6)interface类型是引用类型,需要初始化,否则为nil7)空接口interface{}没有任何方法,

Izelern的博客 1313

Go基础学习-struct、method

结构体 可以封装多个基本数据类型;来实现面向对象;是值类型;占用一块连续的内存空间 关于Go语言中的内存对齐 :推荐阅读:在 Go 中恰到好处的内存对齐 /* 定义: type 类型名 struct { 字段名 字段类型 字段名 字段类型 … } 类型名:标识自定义结构体的名称,在同一个包内不能重复。首字母大写对外包引用 字段名:表示结构体字段名。结构体中的字段名必须唯一。对外包引用首字符必须大写 字段类型:表示结构体字段的具体类型。 */ type person struct

wzbwzt的博客 355
上一篇: golang 格式“占位符”%d,%f,%s等应用类型
下一篇: Go 单例模式
琅琊山二当家
博客等级 码龄18年 447粉丝 322原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值