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

相关文章

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【VueJS】深入理解 computed 和 methods 方法

前言   模板内的表达式是非常便利的,但是它们实际上只用于简单的运算。在模板中放入太多的逻辑会让模板过重且难以维护。例如: <div id="example">{{ message.split('').reverse().join('') }}</div> computed 方法   所以引入了计算属性computed,将复杂的逻辑放入计算中进行处理,同时computed有缓存功能,

Vue3,格式化时间的函数作为组件的方法(methods)、计算属性(computed properties)来使用

确实,在Vue3组件中,你可以将这些用于格式化时间的函数作为组件的方法(methods)来使用,或者更优雅地,作为计算属性(computed properties)来使用,特别是当你需要基于响应式数据动态地格式化时间时。 作为方法(Methods) 在Vue组件的methods对象中定义这些函数,并在模板或其他方法中调用它们。 <template> <div> <p>Formatted

【AIGC】Transformer模型:Postion Embedding概述、应用场景和实现方式的详细介绍。

🏆🏆欢迎大家来到我们的天空🏆🏆 🏆🏆如果文章内容对您有所触动,别忘了点赞、关注,收藏! 🏆 作者简介:我们的天空 🏆《头衔》:大厂高级软件测试工程师,阿里云开发者社区专家博主,CSDN人工智能领域新星创作者。 🏆《博客》:人工智能,深度学习,机器学习,python,自然语言处理,AIGC等分享。 所属的专栏:TensorFlow项目开发实战,人工智能技术 🏆🏆主页:我们

深入RAG优化:BGE词嵌入全解析与Landmark Embedding新突破

前面已经写过一篇关于Embedding选型的文章,《如何高效选择RAG的中文Embedding模型?揭秘最佳实践与关键标准!》,主要介绍通过开源网站的下载量和测评效果选择Embedding模型。 一、Embedding选型建议与结果 选型建议: 1、大部分模型的序列长度是 512 tokens。8192 可尝试 tao-8k,1024 可尝试 stella。 2、在专业数据领域上,嵌入

关于NLP的word Embedding

Embedding在数学上表示一个maping, f: X -> Y, 也就是一个function,其中该函数是injective(就是我们所说的单射函数,每个Y只有唯一的X对应,反之亦然)和structure-preserving (结构保存,比如在X所属的空间上X1 < X2,那么映射后在Y所属空间上同理 Y1 < Y2)。那么对于word embedding,就是将单词word映射到另外

【ros2】 const builtin_interfaces::msg::Time timestamp解析

解析 const builtin_interfaces::msg::Time & timestamp 1. 数据类型 builtin_interfaces::msg::Time 是 ROS 2 中的一个消息类型,用于表示时间戳。 2. 结构 builtin_interfaces::msg::Time 包含以下字段: struct Time{std::uint32_t sec;std::

点击率预测模型Embedding层的学习和训练

导读: 本文将简要介绍推荐模型的发展历史,现状,和下一步的研究趋势。并重点介绍针对embedding数据的模型训练及优化。主要包含以下几大部分内容: CTR预测模型(CTR Models)连续值处理(Continuous Feature)交叉特征建模(Interaction Modelling)大Embedding模型训练(Distributed Training)总结和展望 01 CTR预

关于Embedding的两种实现方式

目录 言简意赅方式一方式二以DNN为例两种方式全部demo代码 言简意赅 假设现在有一段话:“我爱你中国”,在训练入模的时候,常用的方法分别有:onehot、embedding、hash,如果词表很大、特征很多,那么onehot之后会极其稀疏,hash也会有一定的hash冲突,所以这其中emb是最常用的方法。 我们希望,通过一个向量去表征每一个词,以“我爱你中国”为例,将其映射成为一

初识 Embedding,为何大家都基于它搭建私人智能客服?

随着 AI 技术的发展,大家在日常使用过程中经常会碰到一些目前 GPT4 也无法解决的问题: 无法获取个人私有数据信息,进行智能问答无法获取最新信息,LLM 模型训练都是都是有截止日期的无法定制化私有的专属模型,从而在某个领域内取得更好效果 基于以上问题 OpenAI 官方提供了两种不同私有化模型定制方式:Fine-Tuning(微调)、Embedding(嵌入)。 一、Fine-Tunin