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

相关文章

【Semantic Embedding】: BERT模型

时间过的是真快,bert已经是去年火起来的模型了。 论文"BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding" 地址:https://arxiv.org/abs/1810.04805    要了解bert一定要先看看tranformer模型,就是那篇"attention is all

【Semantic Embedding】: LSTM-DSSM模型

论文下载地址:https://arxiv.org/pdf/1412.6629.pdf 其实这几篇论文,DSSM, C-DSSM, LSTM-DSSM 百度一下资料一大堆,不过我还是选择自己去看了一遍,然后做一下笔记,便于更深入的理解。不过看完了论文发现,这几篇文章真的是短小精悍。。。基本都是五六页结束。 这篇文章还是一样的套路,是这对DSSM模型的修改,毕竟全连接网络是最简单的神经网络,替换一

【Semantic Embedding】: CDSSM(CLSM)模型

文章下载地址:https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cikm2014_cdssm_final.pdf DSSM模型的输入是query和doc的词袋模型生成的向量,所以模型丢失来文本的上下文结构信息。而CDSSM模型则通过词的n-gram和卷积池化操作来捕获上下文关系,按文章说明的,该算法相比原始DS

【Semantic Embedding】: DSSM模型

论文下载地址 代码实现 DSSM现在应该已经算是经典的文章了,有些年头了。网上已经有很多优秀的博客对该算法进行分析,建议去看那些文章,讲的比较全面。 DSSM的思想是利用搜索点击数据,分别将query和documents利用DNN映射到高纬语义空间,然后将query和document的高纬语义向量利用余弦相似度,对向量进行相似度计算。 训练阶段,对于点击数据,如果在当前query下,被点击

【Graph Embedding】: SDNE算法

论文“Structural Deep Network Embedding”发表在kdd2016 论文下载地址:https://www.kdd.org/kdd2016/papers/files/rfp0191-wangAemb.pdf 论文利用深度自编码器来学习图中节点的embedding向量,结合一阶和二阶相似度进行联合训练,将二阶相似度作为无监督信息,捕获全局网络结构信息,一阶相似度作为有监

【Graph Embedding】: LINE算法

论文“LINE: Large-scale Information Network Embedding”发表在WWW‘15上,提出了一个适用于大规模网络embedding算法“LINE”。 论文下载地址:https://arxiv.org/pdf/1503.03578.pdf 作者公布的代码:https://github.com/tangjianpku/LINE 介绍 本篇文章提出的算法定义

【Graph Embedding】: DeepWalk算法

论文“DeepWalk: Online Learning of Social Representations” 发表在kdd2014, 下载地址:https://arxiv.org/pdf/1403.6652.pdf 作者开源的代码:https://github.com/phanein/deepwalk 文章提出的deepwalk用于学习图网络中节点的低维表示,学习出的低纬embedding

如何利用chatgpt embedding技术打造知识库

embedding 是指将单词、短语或文本转换成连续向量空间的过程。这个功能可以广泛的用在分类,搜索,推荐等场景。而且使用embedding技术可以突破chatGPT对于token的限制。 今天这期视频就通过实际的代码演示,看看如何使用chatGPT的embedding功能,并演示一个知识库的demo 详情请查看视频 如何利用chatgpt embedding技术打造知识库_哔哩哔哩_b

embedding的原理和结构

embedding(向量化)是一个将数据转化为向量矩阵的过程,作用是:将高维稀疏向量转化为稠密向量,从而方便下游模型处理 简单的概念大家应该都知道了,以LLM为例 输入:文字 模型:embedding 输出:向量 我疑惑的难点主要为以下: 1.embedding的结构√ 2.embedding的训练(根据不同的目标进行数据不同的组织形式,进行相对应任务的训练,可以看结构想到) 3.embedd

pytorch中的可学习查找表实现之nn.Embedding

假设我们需要一个查找表(Lookup Table),我们可以根据索引数字快速定位查找表中某个具体位置并读取出来。最简单的方法,可以通过一个二维数组或者二维list来实现。但如果我希望查找表的值可以通过梯度反向传播来修改,那么就需要用到nn.Embedding来实现了。 其实,我们需要用反向传播来修正表值的场景还是很多的,比如我们想存储数据的通用特征时,这个通用特征就可以用nn.Embedding