Go语言学习9-结构体类型

2023-11-17

引言

书接上篇,我们了解了Go语言的接口类型,现在介绍Go语言的结构体类型。主要如下:

1. 结构体

结构体类型既可以包含若干个命名元素(又称字段),又可以与若干个方法相关联。

1.1 类型表示法

结构体类型的声明可以包含若干个字段的声明。字段声明左边的标识符表示了该字段的名称,右边的标识符代表了该字段的类型,这两个标识符之间用空格分隔。

结构体类型声明中的每个字段声明都独占一行。同一个结构体类型声明中的字段不能出现重名的情况。

结构体类型也分为命名结构体类型匿名结构体类型

命名结构体类型

命名结构体类型以关键字type开始,依次包含结构体类型的名称、关键字struct和由花括号括起来的字段声明列表。如下:

type Sequence struct {
	len int
	cap int
	Sortable
	sortableArray  sort.Interface
}

结构体类型的字段的类型可以是任何数据类型。当字段名称的首字母是大写字母时,我们就可以在任何位置(包括其他代码包)上通过其所属的结构体类型的值(以下简称结构体值)和选择表达式访问到它们。否则当字段名称的首字母是小写,这些字段就是包级私有的(只有在该结构体声明所属的代码包中才能对它们进行访问或者给它们赋值)。

如果一个字段声明中只有类型而没有指定名称,这个字段就叫做匿名字段。如上结构体 Sequence 中的 Sortable 就是一个匿名字段。匿名字段有时也被称为嵌入式的字段或结构体类型的嵌入类型。

匿名字段的类型必须由一个数据类型的名称或者一个与非接口类型对应的指针类型的名称代表。代表匿名字段类型的非限定名称将被隐含地作为该字段的名称。如果匿名字段是一个指针类型的话,那么这个指针类型所指的数据类型的非限定名称(由非限定标识符代表的名称)就会被作为该字段的名称。非限定标识符就是不包含代码包名称和点的标识符。

匿名类型的隐含名称的实例,如下:

type Anonymities struct {
	T1
	*T2
	P.T3
	*P.T4
}

这个名为 Anonymities 的结构体类型包含了4个匿名字段。其中,T1P.T3 为非指针的数据类型,它们隐含的名称分别为 T1T3;*T2 和 *P.T4 为指针类型,它们隐含的名称分别为 T2T4

注意:匿名字段的隐含名称也不能与它所属的结构体类型中的其他字段名称重复。

结构体类型中的嵌入字段的类型所附带的方法都会成为该结构体类型的方法,结构体类型自动实现了它包含的所有嵌入类型所实现的接口类型。但是嵌入类型的方法的接收者类型仍然是该嵌入类型,而不是被嵌入的结构体类型。当在结构体类型中调用实际上属于嵌入类型的方法的时候,这一调用会被自动转发到这个嵌入类型的值上。

现在对 Sequence 的声明进行改动,如下:

type Sequence struct {
	Sortable
	sorted bool
}

上面的 Sequence 中的匿名字段 Sortable 用来存储和操作可排序序列,布尔类型的字段 sorted 用来表示类型值是否已经被排序。

假设有一个 Sequence 类型的值 seq,调用 Sortable 接口类型中的方法 Sort,如下:

seq.Sort()

如果 Sequence 类型中也包含了一个与 Sortable 接口类型中的方法 Sort 的名称和签名相同的方法,那么上面的调用一定是对 Sequence 类型值自身附带的 Sort 方法的调用,而嵌入类型 Sortable 的方法 Sort 被隐藏了。

如果需要在原有的排序操作上添加一些额外功能,可以这样声明一个同名的方法:

func (self *Sequence) Sort() {
	self.Sortable.Sort()
	self.sorted = true
}

这样声明的方法实现了对于匿名字段 SortableSort 方法的功能进行无缝扩展的目的。

如果两个 Sort 方法的名称相同但签名不同,那么嵌入类型 Sortable 的方法 Sort 也同样会被隐藏。这时,在 Sequence 的类型值上调用 Sort 方法的时候,必须依据该 Sequence 结构体类型的 Sort 方法的签名来编写调用表达式。如下声明 Sequence 类型附带的名为 Sort 的方法:

func (self *Sequence) Sort(quicksort bool) {
	//省略若干语句
}

但是调用表达式 seq.Sort() 就会造成一个编译错误,因为 Sortable 的无参数的 Sort 方法已经被隐藏了,只能通过 seq.Sort(true)seq.Sort(false) 来对 SequenceSort 方法进行调用。

注意:无论被嵌入类型是否包含了同名的方法,调用表达式 seq.Sortable.Sort() 总是可以来调用嵌入类 SortableSort 方法。

现在,区别一下嵌入类型是一个非指针的数据类型还是一个指针类型,假设有结构体类型 S 和非指针类型的数据类型 T,那么 *S 表示指向 S 的指针类型,*T 表示指向 T 的指针类型,则:

  1. 如果在 S 中包含了一个嵌入类型 T,那么 S 和 *S 的方法集合中都会包含接收者类型为 T 的方法。除此之外,*S 的方法集合中还会包含接收者类型为 *T 的方法。

  2. 如果在 S 中包含了一个嵌入类型 *T,那么 S 和 *S 的方法集合中都会包含接收者类型为 T 和 *T 的所有方法。

现在再讨论另一个问题。假设,我们有一个名为 List 的结构体类型,并且在它的声明中嵌入了类型 Sequence,如下:

type List struct {
	Sequence
}

假设有一个 List 类型的值 list,调用嵌入的 Sequence 类型值的字段 sorted,如下:

list.sorted

如果 List 类型也有一个名称为 sorted 的字段的话,那么其中的 Sequence 类型值的字段 sorted 就会被隐藏。

注意: 选择表达式 list.sorted 只代表了对 List 类型的 sorted 字段的访问,不论这两个名称为 sorted 的字段的类型是否相同。和上面的类似,这里选择表达式 list.Sequence.sorted 总是可以访问到嵌入类型 Sequence 的值的 sorted 字段。

对于结构体类型的多层嵌入的规则,有两点需要说明:

  1. 可以在被嵌入的结构体类型的值上像调用它自己的字段或方法那样调用任意深度的嵌入类型值的字段或方法。唯一的前提条件就是这些嵌入类型的字段或方法没有被隐藏。如果它们被隐藏,也可以通过类似 list. Sequence.sorted 这样的表达式进行访问或调用它们。

  2. 被嵌入的结构体类型的字段或方法可以隐藏任意深度的嵌入类型的同名字段或方法。任何较浅层次的嵌入类型的字段或方法都会隐藏较深层次的嵌入类型包含的同名的字段或方法。注意,这种隐藏是可以交叉进行的,即字段可以隐藏方法,方法也可以隐藏字段,只要它们的名称相同即可。

如果在同一嵌入层次中的两个嵌入类型拥有同名的字段或方法,那么涉及它们的选择表达式或调用表达式会因为编译器不能确定被选择或调用的目标而造成一个编译错误。

匿名结构体类型

匿名结构体类型比命名结构体类型少了关键字type类型名称,声明如下:

struct {
	Sortable
	sorted bool
}

可以在数组类型、切片类型或字典类型的声明中,将一个匿名的结构体类型作为他们的元素的类型。还可以将匿名结构体类型作为一个变量的类型,例如:

var anonym struct {
	a int
	b string
}

不过对于上面,更常用的做法就是在声明以匿名结构体类型为类型的变量的同时对其初始化,例如:

anonym := struct {
	a int
	b string
}{0, "string"}

与命名结构体类型相比,匿名结构体类型更像是“一次性”的类型,它不具有通用性,常常被用在临时数据存储和传递的场景中。

在Go语言中,可以在结构体类型声明中的字段声明的后面添加一个字符串字面量标签,以作为对应字段的附加属性。例如:

type Person struct {
	Name 	string `json:"name"`
	Age		uint8 `json:"age"`
	Address	string `json:"addr"`
}

如上的字段的字符串字面量标签一般有两个反引号包裹的任意字符串组成。并且,它应该被添加但在与其对应的字段的同一行的最右侧。

这种标签对于使用该结构体类型及其值的代码来说是不可见的。但是,可以用标准库代码包 reflect 中提供的函数查看到结构体类型中字段的标签。这种标签常常会在一些特殊应用场景下使用,比如,标准库代码包 encoding/json 中的函数会根据这种标签的内容确定与该结构体类型中的字段对应的 JSON 节点的名称。

1.2 值表示法

结构体值一般由复合字面量(类型字面量和花括号构成)来表达。在Go语言中,常常将用于表示结构体值的复合字面量简称为结构体字面量。在同一个结构体字面量中,一个字段名称只能出现一次。例如:

Sequence{Sortable: SortableStrings{"3", "2", "1"}, sorted: false}

类型 SortableStrings 实现了接口类型 Sortable,这个可以在Go语言学习笔记4中了解到。这里就可以把一个 SortableStrings 类型的值赋给 Sortable 字段。

编写结构体字面量,还可以忽略字段的名称,但有如下的两个限制:

  1. 如果想要省略其中某个或某些键值对的键,那么其他的键值对的键也必须省略。

    Sequence{ SortableStrings{"3", "2", "1"}, sorted: false} // 这是不合法的
    
  2. 多个字段值之间的顺序应该与结构体类型声明中的字段声明的顺序一致,并且不能够省略掉任何一字段的赋值。但是不省略字段名称的字面量却没有此限制。例如:

    Sequence{ sorted: false , Sortable: SortableStrings{"3", "2", "1"}} // 合法
    Sequence{SortableStrings{"3", "2", "1"}, false} // 合法	
    Sequence{ Sortable: SortableStrings{"3", "2", "1"}} // 合法,未被明确赋值的字段的值会被其类型的零值填充。
    Sequence{ false , SortableStrings{"3", "2", "1"}} // 不合法,顺序不一致,会编译错误
    Sequence{ SortableStrings{"3", "2", "1"}} // 不合法,顺序不一致,会编译错误
    

在Go语言中,可以在结构体字面量中不指定任何字段的值。例如:

Sequence{} // 这种情况下,两个字段都被赋予它们所属类型的零值。

与数组类型相同,结构体类型属于值类型。结构体类型的零值就是如上的不为任何字段赋值的结构体字面量。

1.3 属性和基本操作

一个结构体类型的属性就是它所包含的字段和与它关联的方法。在访问权限允许的情况下,我们可以使用选择表达式访问结构体值中的字段,也可以使用调用表达式调用结构体值关联的方法。

在Go语言中,只存在嵌入而不存在继承的概念。不能把前面声明的 List 类型的值赋给一个 Sequence 类型的变量,这样的赋值语句会造成一个编译错误。在一个结构体类型的别名类型的值上,既不能调用那个结构体类型的方法,也不能调用与那个结构体类型对应的指针类型的方法。别名类型不是它源类型的子类型,但别名类型内部的结构会与它的源类型一致。

对于一个结构体类型的别名类型来说,它拥有源类型的全部字段,但这个别名类型并没有继承与它的源类型关联的任何方法。

如果只是将 List 类型作为 Sequence 类型的一个别名类型,那么声明如下:

type List Sequence

此时,List 类型的值的表示方法与 Sequence 类型的值的表示方法一样,如下:

List{ SortableStrings{"4", "5", "6"}, false}

如果有一个 List 类型的值 List,那么选择表达式 list.sorted 访问的就是这个 List 类型的值的 sorted 字段,同样,我们也可以通过选择表达式 list.Sortable 访问这个值的嵌入字段 Sortable。但是这个 List 类型目前却不包含与它的源类型 Sequence 关联的方法。

在Go语言中,虽然很多预定义类型都属于泛型类型(比如数组类型、切片类型、字典类型和通道类型),但却不支持自定义的泛型类型。为了使 Sequence 类型能够部分模拟泛型类型的行为特征,只是向它嵌入 Sortable 接口类型是不够的,需要对 Sortable 接口类型进行拓展。如下:

type GenericSeq interface {
	Sortable
	Append(e interface{}) bool
	Set(index int, e interface{}) bool
	Delete(index int) (interface{}, bool)
	ElemValue(index int) interface{}
	ElemType() reflect.Type
	value() interface{}
}

如上的接口类型 GenericSeq 中声明了用于添加、修改、删除、查询元素,以及获取元素类型的方法。一个数据类型要实现 GenericSeq 接口类型,也必须实现 Sortable 接口类型。

现在,将嵌入到 Sequence 类型的 Sortable 接口类型改为 GenericSeq 接口类型,声明如下:

type Sequence struct {
	GenericSeq
	sorted bool
	elemType reflect.Type
}

在如上的类型声明中,添加了一个 reflect.Type 类型(即标准库代码包 reflect 中的 Type 类型)的字段 elemType,目的用它来缓存 GenericSeq 字段中存储的值的元素类型。

为了能够在改变 GenericSeq 字段存储的值的过程中及时对字段 sortedelemType 的值进行修改,如下还创建了几个与 Sequence 类型关联的方法。声明如下:

func (self *Sequence) Sort() {
	self.GenericSeq.Sort()
	self.sorted = true
}

func (self *Sequence) Append(e interface{}) bool{
	result := self. GenericSeq.Append(e)
	//省略部分代码
	self.sorted = true
	//省略部分代码
	return result
}

func (self *Sequence) Set(index int, e interface{}) bool {
	result := self. GenericSeq.Set(index, e)
	//省略部分代码
	self.sorted = true
	//省略部分代码
	return result
}

func (self *Sequence) ElemType() reflect.Type {
	//省略部分代码
	self.elemType = self.GenericSeq.ElemType()
	//省略部分代码
	return self.elemType
}

如上的这些方法分别与接口类型 GenericSeqSortable 中声明的某个方法有着相同的方法名称和方法签名。通过这种方式隐藏了 GenericSeq 字段中存储的值的这些同名方法,并对它们进行了无缝扩展。

附录

GenericSeq 接口类型的实现类型以及 Sequence 类型的完整实现代码 点击这里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言学习9-结构体类型 的相关文章

  • fabric2.X以上系统用test-network环境测试自己的链码

    首先 我们需要安装好fabric2 X的环境 具体参考我之前的文章 这里默认已经有了fabric2 X的环境 进入test network文件夹 在开始测试之前 先把gopath项目路径全部解锁 sudo chmod R 777 GOPAT
  • 结构体(声明、初始化、内存对齐、如何传参)

    结构基础知识 聚合数据类型能够同时存储超过一个的单独数据 C提供了两种类型的聚合数据类型 分别是数组和结构体 数组是相同元素的集合 它的每个元素是通过下标引用或指针间接访问的 结构体也是一些值的的集合 这些值称为它 的成员 但一个结构的成员
  • go : GoLand安装及环境配置

    前因后果 新学期新气象 开学的第一节课是zw老师的区块链技术与应用领域 congratulations 涉及编程实验 使用Go语言 需要安装GoLand软件进行下一步 Go语言下载地址 golang下载链接 进去之后选择对应的版本下载 这里
  • error An unexpected error occurred: “https://registry.yarnpkg.com/axios: con 解决方案

    error An unexpected error occurred https registry yarnpkg com axios con 今天用在跑一个项目的时候发现了这个错误 看着像是网络连接不上 发现这里是用的Dokcerfile
  • golang的hijack篡取劫持

    一直不太明白golang的hijack是干什么的 只知道hijack这个词是篡取的意思 难道跟网关的作用一样 把client的请求发到这个服务上 然后这个服务帮忙转发到远端server 但是看了源码后就明白这个golang hijack是干
  • golang数据结构初探之动态数组slice

    动态数组slice slice 又称动态数组 依托于数组实现 可以方便的进行扩容和传递 实际使用时比数组更灵活 但正是因为灵活 实际使用时更容易出错 避免出错的最好方法便是了解其实现原理 特性速览 初始化 声明和初始化切片的方式主要有以下几
  • 彻底弄懂typedef struct和struct定义结构体的区别

    1 语法 定义结构体有两种定义方式 typedef struct 结构名 类型 变量名 类型 变量名 结构别名1 结构别名2 结构名 和 结构别名 都不能直接用 因为它们是结构体这种数据类型的名称 这种方式定义的结构体使用时 需要先声明 结
  • STM32初始化结构体变量时成员排序的问题

    平台 STM32F103RCT6 MDK 笔者在调试时发现 结构体不同类型成员的定义顺序对于程序运行过程中的取值可能会产生很大的BUG 开始时定义 输入参数结构体 typedef struct u8 TempRange 温度最大值 floa
  • Go基础(复杂类型):结构体

    结构体 一个结构体 struct 就是一个字段的集合 而 type 的含义跟其字面意思相符 下面来写一个简单的例子 package main import fmt 一个结构体就是一个字段的集合 type Vertex struct X in
  • go语言连接mysql数据库,并验证连通性

    go语言连接mysql数据库 并验证连通性 package main import database sql sql Open加载包 github com go sql driver mysql 没用到包里的内容但是需要加载一下这个包 lo
  • struct与typedef struct的区别

    typedef是类型定义的意思 typedef struct 是为了使用这个结构体方便 具体区别在于 若struct node 这样来定义结构体的话 在申请node 的变量时 需要这样写 struct node n 若用typedef 可以
  • Go设置国内源

    Go设置国内源 如果你需要Beego这个框架 正常来说你需要安装Git之后go get不会报错 但由于网络问题 go get会非常慢 以至于没法使用 这个时候我们需要需要国内源来进行加速 首先需要我们开启Go的MODULL支持 SETX G
  • Go语言学习9-结构体类型

    结构体类型 引言 1 结构体 1 1 类型表示法 1 2 值表示法 1 3 属性和基本操作 附录 引言 书接上篇 我们了解了Go语言的接口类型 现在介绍Go语言的结构体类型 主要如下 1 结构体 结构体类型既可以包含若干个命名元素 又称字段
  • Go基础(包、变量和函数):开启Go语言之旅

    开启Go语言之旅 Go编程语言是一个开源项目 可以让程序员提高工作效率 Go是富有表现力 简洁 干净和高效的 其并发机制使编写充分利用多核和联网机器的程序变得容易 而其新颖类型系统则可实现灵活的模块化程序构建 快速编译为机器代码 但具有垃圾
  • Go语言学习18-基准测试

    基准测试 引言 基准测试 1 编写基准测试函数 2 计时器 3 内存分配统计 4 基准测试的运行 结语 引言 所谓基准测试 Benchmark Test 简称BMT 是指 通过一些科学的手段实现对一类测试对象的某项性能指标进行可测量 可重复
  • 使用go语言整合gin,驱动bartender打印标签程序

    可以用来当中间件 项目地址 github GitHub wjdsg0327 printer barTender 使用go语言整合gin驱动bartender打印标签 gitee printer barTender 使用go整合gin驱动ba
  • struct和typedef struct的用法和区别

    1 在C和C 里的不同 在c中定义一个结构体类型用typedef typedef struct Student int m Stu 用这种形式定义的时候 在声明结构体变量的时候可用 Stu stu1 这种形式也等同于struct Strde
  • Go语言学习4-数组类型

    数组类型 引言 1 数组 1 1 类型表示法 1 2 值表示法 1 3 属性和基本操作 总结 引言 上篇我们了解 Go语言的基本数据类型 现在开始介绍数组类型 主要如下 1 数组 在Go语言中 数组被称为Array 就是一个由若干相同类型的
  • Go Web编程实战(6)----反射

    目录 反射 反射的3大原则 接口类型变量 转换为 反射类型对象 反射类型对象 转换为 接口类型变量 反射类型对象 修改 值必 可写的 反射 与其他语言一样 Go语言的反射同样是指 计算机程序在运行时 可以访问 检测和修改它本身状态或行为的一
  • 结构体中数组放在最后位置的问题

    以下出自 C Programming FAQS 先看下面的代码 struct name int namelen char namestr 1 struct name makename char newname struct name ret

随机推荐

  • 线性dp的题目汇总

    恩 挺多 慢慢看 衔接在此
  • ccrypt 在 Windows上的使用教程

    ccrypt是个加密解密工具包 一般情况下在Linux上使用 这是个windows版的使用教程 请注意 ccrypt是一个 命令行 程序 它只能从DOS提示符或shell中运行 它不是那种双击就能运行的程序 step1 到官网下载对应的安装
  • gvim for verilog简易配置

    目录 前言 一 gvim的主题和字体资源 二 gvim编辑器基本配置 三 gvim针对verilog配置 总结 前言 分别介绍了gvim的主题和字体资源推荐 gvim编辑器基本配置和针对verilog的配置 以下为正文 一 gvim的主题和
  • 递归算法(demo:斐波那契数列的实现,树的遍历,快速排序)

    递归算法 执行代码 并没执行完全的时候调用自己本身 然后等待条件不满足递归的时候 完全执行代码 执行完全后返回上一层 执行未完成的部分 递归算法与for where循环可以相互转换 通过一定的方案达到一样的效果 比如for循环可以通过栈 实
  • MacOS IDEA配置scala

    1 前提 scala已经在mac本地安装 2 新建项目后 点击项目 右键 点击Add Framwork Support 3 找到scala 刚开始时 scala dk 2 11 8 是没有的 需要自己找 所以点击create 再点击Brow
  • 使用DQN训练Grid_word任务

    Tensorflow实战 一书中 强化学习一章里讲到了DQN网络 很有感触 在这里和大家分享一下 DQN网络也是Q learning的升级版 在原有的Q learning中加入了卷积层 由于深度学习需要大量的样本数据 DQN也就引入了Exp
  • 常见的计算机局域网络的拓扑结构是,局域网常见的拓扑结构有哪三种

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 局域网常见的拓扑结构有星型结构 环型结构和总线型结构 1 星型结构 这种结构是目前在局域网中应用得最为普遍的一种 在企业网络中几乎都是采用这一方式 星型网络几乎是Ether
  • 目标检测和语义分割常用的数据增强(代码)

    语义分割 from PIL import Image ImageFont ImageDraw ImageEnhance import matplotlib pyplot as plt import numpy as np import ra
  • xshell5产品秘钥

    xshell5产品秘钥 150105 116578 999990 转载于 https www cnblogs com lxcmyf p 7551610 html
  • 打开VMware虚拟机时提示“内部错误”

    解决方法 输入命令行 services msc打开服务 将上述服务重启 可以正常进入虚拟机
  • 移动Web:媒体查询及手机端PC端识别

    媒体查询 响应式布局的核心 能够检测视口的宽度 然后编写差异化的 css 样式调整网页的布局方式 响应式布局原理 根据 UI 设计稿需求合理设置响应断点 配合媒体查询书写差异化CSS样式 响应断点是指媒体查询所采用的视口的宽度 作用 将屏幕
  • SAR: 1 4 https://www.vulnhub.com/entry/sar-1%2C425/

    SAR 1 About Release Back to the Top Name Sar 1 Date release 15 Feb 2020 Author Love Series Sar Download Back to the Top
  • 一种基于卷积神经网络的图像去雾研究-含matlab代码

    目录 一 绪论 二 去雾卷积网络 2 1 特征提取 2 2 多尺度映射 2 3 局部均值 2 4 非线性回归 三 实验与分析 四 Matlab代码获取 一 绪论 雾是一种常见的大气现象 空气中悬浮的水滴 灰尘 细沙或其他颗粒等都会引起成像清
  • SpringBoot 配置全局异常处理

    SpringBoot 项目pom xml 依赖配置文件
  • 数字化时代新经营模式千载难逢的翻身机会

    随着互联网的兴起 它对于线下实体商户的冲击早已不是一天两天了 网上店铺的崛起 吸引走了大部分流量 这对于靠流量吃饭的线下商户来说 是致命的打击 相关数据统计 这几年 随着网络购物越来越火热 越来越成为一种消费主流 线下实体商户的闭店率出现了
  • 迪文串口屏TTL与主控板RS232电平信号转换方案

    一 TTL和RS232简述 串口 COM口是指的物理接口形式 硬件 按位 bit 发送和接收字节 而TTL RS 232是指的电平标准 电信号 TTL和RS232不同在于 电平表示的逻辑含义不同 1 TTL 逻辑高电平 1 3 3V或5V
  • (转)工业机器人用什么语言编程的?

    机器人的开发语言一般为C C C Builder VB VC等语言 主要取决于执行机构 伺服系统 的开发语言 而机器人编程分为示教 动作级机器人编程语言 任务级编程语言三个级别 机器人编程语言分为专用操作语言 如VAL语言 AL语言 SLI
  • Dynamic Web project,Jsp可正常访问,servlet出现404,刷新出现Http500,解决方式

    新手建立首个Dynamic Web project Jsp可正常访问 servlet出现404 刷新出现Http500 解决方式如下 Tips 关于配置servlet到web xml Servlet class 为pakagename se
  • PyTorch 的 Autograd详解

    点击蓝字 关注视学算法 作者丨xiaopl 知乎 来源丨https zhuanlan zhihu com p 69294347 编辑丨极市平台 PyTorch 作为一个深度学习平台 在深度学习任务中比 NumPy 这个科学计算库强在哪里呢
  • Go语言学习9-结构体类型

    结构体类型 引言 1 结构体 1 1 类型表示法 1 2 值表示法 1 3 属性和基本操作 附录 引言 书接上篇 我们了解了Go语言的接口类型 现在介绍Go语言的结构体类型 主要如下 1 结构体 结构体类型既可以包含若干个命名元素 又称字段