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}

}
我想自己组装一台服务器,微调大模型通义千问2.5 Omni 72B,但是我是个人购买,资金非常有限,最省的方案 阶段动作✅ 推理用 GGUF + llama.cpp + 4090 加载 14B INT4✅ 微调训练 Qwen2.5-7B-Chat,使用 LoRA / QLoRA❌ 放弃Qwen2.5-Omni-72B 全量微调(显存需求 >160G,不现实) 阅读详情

相关推荐

《生成式AI引发的“认知污染”:社交媒体虚假信息的治理困局》

认知污染与生成式AI“认知污染”指信息环境被大量虚假、误导性内容所充斥,干扰公众对事实的认知判断。在社交媒体时代,虚假信息的生产和传播门槛大幅降低,呈现出工业化、规模化的趋势。近年兴起的生成式人工智能(Generative AI)技术,如大型语言模型(LLM)和深度伪造(deepfake),更是加剧了这一问题。AI可以自动生成看似真实的文本、图像、音视频,将虚假信息批量生产并快速散播到社交平台上。

那谁的博客 5913

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

实战ByteTrack:用C++手把手教你实现多目标跟踪(附完整代码解析)

本文通过C++实战教程,手把手教你实现ByteTrack多目标跟踪算法。文章详细解析了算法核心,包括利用卡尔曼滤波进行状态预测、匈牙利算法完成数据关联,以及ByteTrack独特的三次匹配策略来有效处理低置信度检测框,并提供了完整的项目架构、代码实现与性能优化指南。

yolo5detector的博客 299

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

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

zevjay的博客 2000

Python程序—定子故障三相永磁同步电动机振动与电流数据集

1.0 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为2.26%: 匝间短路故障,严重度为2.70%: 匝间短路故障,严重度为3.35%: 匝间短路故障,严重度为4.41%: 匝间短路故障,严重度为6.48%: 匝间短路故障,严重度为12.17%: 匝间短路故障,严重度为21.69%1.5 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为1.57%: 匝间短路故障,严重度为1.88%: 匝间短路故障,严重度为2.34%

m0_66465741的博客 1320

经典蓝牙中的Sniff、Hold与Park模式

若主设备在Sniff Attempt窗口外发送数据,从设备无法接收,需依赖重传机制。移动时立即传输数据。:Sniff Interval=20ms,Attempt=1时隙。:传感器每2秒唤醒一次同步信标,主设备按需唤醒特定传感器采集数据。Slave进入Sniff模式:每20ms唤醒1个时隙监听数据。:设备需要短暂执行高优先级任务(如扫描其他蓝牙设备)。:无数据传输超时后,设备可能自动进入Sniff模式。:主设备通过信标唤醒从设备,或从设备主动请求退出(:平衡功耗与响应速度,适合间歇性数据传输设备。

shishuangquan111的博客 1673

10 分钟搞定 Golang 结构体

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

残星说梦话 1037

GD32F303标准库开发:Keil5新建GD32标准库工程

GD32F303标准库开发:Keil5新建GD32标准库工程

MQ0522的博客 8904

golang struct(结构体)详解一

golang struct(结构体)详解一

grb123的博客 2085

LeRobot 入门教程(七)数据集

LeRobot Dataset v3.0 是机器人学习数据的标准化格式,支持多模态时间序列数据和视频的统一访问。该版本通过基于文件的存储(Parquet/MP4)、关联元数据和Hub原生流式处理等新特性,显著提升了性能并降低了存储开销。文档详细介绍了格式设计、安装使用、数据记录与加载方法,以及从v2.1迁移到v3.0的步骤,特别针对大型数据集(如DROID 1.0.1)的处理提供了SLURM集群移植方案。v3.0通过优化文件组织和元数据管理,实现了更快的加载速度、更高的内存效率和更好的可扩展性。

2506_90492529的博客 2055

设计四翼无人机(Quadcopter)的自主降落控制算法

为四翼无人机建立动力学模型,包括其姿态(Pitch, Roll, Yaw)和位置(X, Y, Z)的变化。可以使用Aerospace Blockset中的预制模块,或者根据具体需求构建自定义模型。示例:简化动力学模型利用块模拟四翼无人机的基本行为,确保模型能够反映电机输出如何影响姿态和位置变化。

amy_mhd的博客 242

golang-基础知识(struct)

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

wuh2333的博客 582

【异常】OpenClaw总Token超限400报错400 Total tokens of image and text exceed max message tokens. Request id:

摘要: 多模态大模型调用中,图文总Token超限导致的400报错是常见问题。本文分析了该报错的触发原因(文本+图片Token总和超出接口限额),并从技术层面解释了多模态Token的计数规则。解决方案分为三个层次:1)紧急修复(精简文本、压缩图片、拆分请求);2)标准化根治(预校验Token、图片预处理、限额适配);3)进阶兜底(分块处理、模型升级、容错机制)。通过前置管控与源头优化,可有效解决并预防此类问题,提升业务稳定性。

奶爸的编程之路,也就一周冷个三天 832

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

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

BigData_Mining的博客 1997

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

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

qq_42476938的博客 401

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

13 Go语言——Struct 和Method

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

weixin_33825683的博客 160

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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、付费专栏及课程。

余额充值