Structs、Methods、Interfaces and Embedding

2024-02-12 22:18

本文主要是介绍Structs、Methods、Interfaces and Embedding,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

结构体

声明结构体

type rect struct {name          stringwidth, height float64
}

创建结构体

r := rect{"rect_struct", 10, 100}
fmt.Println(r)

{rect_struct 10 100}

r := rect{name: "rect_struct", width: 10, height: 100}
fmt.Println(r)

{rect_struct 10 100}

r := rect{name: "rect_struct"}
fmt.Println(r)

{rect_struct 0 0}

取值

r := rect{"rect_struct", 10, 100}
rp := &r
fmt.Println(r)

{rect_struct 10 100}

fmt.Println(r.name)

rect_struct

fmt.Println(rp)

&{rect_struct 10 100}

fmt.Println(rp.name)

rect_struct

赋值

r := rect{"rect_struct", 10, 100}
rp := &r
r.width = 20
fmt.Println(r.width)
rp.width = 200
fmt.Println(rp.width)

20
200

结构体方法

声明结构体和结构体方法

type rect struct {name          stringwidth, height float64
}
func (r rect) area() float64 {return r.width * r.height
}func (r rect) perim() float64 {return 2*r.width + 2*r.height
}

这里为结构体值定义方法,好处是方法运行时不会影响到调用方法的结构体,坏处是无法修改结构体的值。

func (r *rect) area() float64 {return r.width * r.height
}func (r *rect) perim() float64 {return 2*r.width + 2*r.height
}

这里为结构体指针定义方法,好处是方法运行时不会复制结构体,坏处是会影响到调用方法的结构体。

调用结构体方法

func (r rect) area() float64 {return r.width * r.height
}func (r *rect) perim() float64 {return 2*r.width + 2*r.height
}

这里定义两个不同的方法,分别对应“值调用者”和“指针调用者”。

r := rect{"rect_struct", 10, 100}
fmt.Println("area:", r.area())
fmt.Println("perim:", r.perim())

area: 1000
perim: 220

rp = &r
fmt.Println("area:", rp.area())
fmt.Println("perim:", rp.perim())

area: 1000
perim: 220

从中可以看出,不管是“值调用者”还是“指针调用者”,对结果毫无影响。

接口

定义接口

type geometry interface {area() float64perim() float64
}

定义结构体

type rect struct {name          stringwidth, height float64
}type circle struct {name   stringradius float64
}

定义结构体方法

func (r *rect) area() float64 {return r.width * r.height
}func (r *rect) perim() float64 {return 2*r.width + 2*r.height
}func (c *circle) area() float64 {return math.Pi * c.radius * c.radius
}func (c *circle) perim() float64 {return 2 * math.Pi * c.radius
}

从中可以看出,结构体方法与定义的接口一一对应。

调用结构体方法

func measure(g geometry) {fmt.Println(g, "with", "area:", g.area(), "perim:", g.perim())
}

定义方法,用于调用接口方法。

r := rect{"rect_struct", 10, 100}
c := circle{"circle_struct", 10}measure(r)
measure(c)
{rect_struct 10 100} with area: 1000 perim: 220
{circle_struct 10} with area: 314.1592653589793 perim: 62.83185307179586

内嵌

声明内嵌结构体

type base struct {name string
}func (b base) baseDescribe() string {return fmt.Sprintf("base with name: %v", b.name)
}type container struct {title string
}func (c *container) containerDescribe() string {return fmt.Sprintf("container with title: %v", c.title)
}

声明结构体

type rect struct {base*containerwidth, height float64
}func (r rect) area() float64 {return r.width * r.height
}func (r rect) perim() float64 {return 2*r.width + 2*r.height
}type circle struct {base*containerradius float64
}func (c *circle) area() float64 {return math.Pi * c.radius * c.radius
}func (c *circle) perim() float64 {return 2 * math.Pi * c.radius
}

调用结构体

r := rect{base{"rect_struct"}, &container{"rect_container"}, 10, 100}
fmt.Println(r)
fmt.Println(r.name, r.base.name)
fmt.Println(r.title, r.container.title)
fmt.Println(r.baseDescribe(), r.containerDescribe())
fmt.Println("area:", r.area(), "perim:", r.perim())

{{rect_struct} 0xc000096250 10 100}
rect_struct rect_struct
rect_container rect_container
base with name: rect_struct container with title: rect_container
area: 1000 perim: 220

c := circle{base{"circle_struct"}, &container{"circle_container"}, 10}
fmt.Println(c)
fmt.Println(c.name, c.base.name)
fmt.Println(c.title, c.container.title)
fmt.Println(c.baseDescribe(), c.containerDescribe())
fmt.Println("area:", c.area(), "perim:", c.perim())

{{circle_struct} 0xc0000962e0 10}
circle_struct circle_struct
circle_container circle_container
base with name: circle_struct container with title: circle_container
area: 314.1592653589793 perim: 62.83185307179586

调用接口

type describer interface {baseDescribe() stringcontainerDescribe() string
}var rd describer = r
fmt.Println(rd, "with", "baseDescribe:", rd.baseDescribe(), "containerDescribe:", rd.containerDescribe())
var cd describer = c
fmt.Println(cd, "with", "baseDescribe:", cd.baseDescribe(), "containerDescribe:", cd.containerDescribe())

{{rect_struct} 0xc000096250 10 100} with baseDescribe: base with name: rect_struct containerDescribe: container with title: rect_container
{{circle_struct} 0xc0000962e0 10} with baseDescribe: base with name: circle_struct containerDescribe: container with title: circle_container

这篇关于Structs、Methods、Interfaces and Embedding的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703745

相关文章

AI大模型企业应用实战(14)-langchain的Embedding

1 安装依赖 ! pip install --upgrade langchain! pip install --upgrade openai==0.27.8! pip install -U langchain-openai ! pip show openai! pip show langchain! pip show langchain-openai 2 Embed_document

Vue中data的属性可以和methods中方法同名吗,为什么?

在Vue中,data的属性不可以和methods中的方法同名,原因如下: 命名规范:从编程规范的角度来看,同名属性或方法可能会导致混淆和难以维护的代码。data通常用于存储组件的状态或数据,而methods则包含组件的行为或方法。将两者命名为相同的名称可能会使其他开发者或未来的你难以理解和维护代码。覆盖问题:在Vue的实例或组件中,data、methods、computed、watch等属性或方

【机器学习300问】126、词嵌入(Word Embedding)是什么意思?

人类的文字,作为一种高度抽象化的符号系统,承载着丰富而复杂的信息。为了让电脑也能像人类一样理解并处理这些文字,科学家们不断探索各种方法,以期将人类的语言转化为计算机能够理解的格式。 一、One-Hot编码的不足         在自然语言处理发展的早期,给文字进行编码是处理文本数据的主要手段。其中,One-Hot编码是一种简单直观的方法,它将每个单词或字符映射为一个独特的二进制

RAG系列之:深入浅出 Embedding

RAG系列之:深入浅出 Embedding 什么是文本向量化? 文本向量化就是将文本数据转成数字数据,例如:将文本 It was the best of times, it was the worst of times. 转成 [0, 1, 0, 2, 2, 2, 2, 2, 0, 1]。 为什么要进行文本向量化? 因为计算机只能处理数字数据,而不能直接处理文本数据。为了让计算机高效地处理

Embedding 模型的选择和微调

构建一个检索增强生成 (Retrieval-Augmented Generation, RAG) 应用的概念验证过程相对简单,但要将其推广到生产环境中则会面临多方面的挑战。 『RAG 高效应用指南』系列将就如何提高 RAG 系统性能进行深入探讨,提供一系列具体的方法和建议。同时读者也需要记住,提高 RAG 系统性能是一个持续的过程,需要不断地评估、优化和迭代。 在本篇文章中,笔者将讨论以下

认识大模型Embedding技术,加代码实战

网址:https://itgogogo.cn 大家好 有朋友说想学习大模型应用开发技术,让我谈一谈。 首先大模型应用开发技术不需要我们掌握机器学习和深度学习的算法,但是要有编程思维,python 基础,然后跟着下面的步骤走,就能学得明白。 一、什么是 Embedding Embedding (嵌入)是一个浮点数的向量(列表)。两个向量之间的距离度量它们的相关性,小的距离表示高相关性,

论文笔记:ATime-Aware Trajectory Embedding Model for Next-Location Recommendation

Knowledge and Information Systems, 2018 1 intro 1.1 背景 随着基于位置的社交网络(LBSNs),如Foursquare和Facebook Places的日益流行,大量用户签到数据变得可用 这些大量签到数据的可用性带来了许多有用的应用,以提升基于位置服务的用户体验其中一个任务是新兴的下一个位置推荐下一个位置推荐根据用户过去的签到记录,预测可能

Structs select标签的属性

Structs  select标签的属性 对于s:select中的list属性一定要初始化,如“list="#request.listYear"”否则会提示找不到该list 名称 必填 缺省值类   型描述 emptyOption false           false            Boolean 是否在题头选项后面添加一个空的(--)选项 headerKey fal

Embedding模型部署及效果评测

最近大模型发展迅速,与之对应的向量化需求也被带动起来了,由此社区也衍生出很多模型,本文选几款,简单做下评测。 前置概念 为方便读者,先简单介绍几个概念。 概念1:Vector Embedding 也即向量化嵌入,举个例子: 想象一下,你是一位市场研究员,职责是分析消费者的购买行为,并为你的客户提供针对性的营销策略。在你的数据库中,有成千上万的消费者交易记录,每条记录都包含了消费者的个人信

发布会后苹果股价创历史新高;商汤 Embedding 模型拿下 SOTA丨 RTE 开发者日报 Vol.223

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑的个人观点,欢迎大家留言、跟帖、讨论。 本期编辑:@CY,@JLT,@鲍勃 01 有话题的