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
  • pprof 性能分析

    pprof 是一个强大的性能分析工具 可以捕捉到多维度的运行状态的数据 在程序运行过程中可以获取cpu heap block traces等执行信息 一般情况下使用下列三种pprof分析 runtime pprof 采集程序 非 Serve
  • go-libp2p中文文档

    GO LIBP2P入门 这是有关使用libp2p的Go实现go libp2p的一系列教程中的第一篇 我们将介绍安装Go 设置新的Go模块 启动libp2p节点以及在它们之间发送ping消息 安装Go go libp2p建议使用包含模块功能的
  • Go语言学习15-基本流程控制

    基本流程控制 流程控制对比 Go 和 C 基本流程控制 1 代码块和作用域 2 if 语句 3 switch语句 3 1 表达式switch语句 3 2 类型switch语句 4 for 语句 4 1 for 子句 4 2 range 子句
  • 彻底弄懂typedef struct和struct定义结构体的区别

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

    Gin框架 gin框架路由使用前缀树 路由注册的过程是构造前缀树的过程 路由匹配的过程就是查找前缀树的过程 gin框架的中间件函数和处理函数是以切片形式的调用链条存在的 我们可以顺序调用也可以借助c Next 方法实现嵌套调用 借助c Se
  • golang 详解协程——errgroup

    为什么要有sync errgroup go支持并发 一般采用的是 channel sync WaitGroup context 来实现各个协程之间的流程控制和消息传递 但是对于开启的成千上万的协程 如果在每个协程内都自行去打印 错误日志的话
  • GoLang学习资源清单

    地鼠文档go语言文档网站通过收集整理go语言相关的学习文档 为大家提供一个学习平台https www topgoer cn 前景 Go语言中文文档https www topgoer com 文档 Gin Web FrameworkGin W
  • Go语言的跨文件调包

    一 前言 文件的结构如下 go mod main main go util util go 文件在调用其它包的时候 需要在代码中引用其他的函数 包的命名一般都以小写为主 文件中函数的以首字符为大写的函数为共有函数 小写的为私有函数 只能是在
  • Go timer 是如何被调度的?

    hi 大家好 我是 haohongfan 本篇文章剖析下 Go 定时器的相关内容 定时器不管是业务开发 还是基础架构开发 都是绕不过去的存在 由此可见定时器的重要程度 我们不管用 NewTimer timer After 还是 timer
  • Eclipse 导入Go项目

    用Eclipse开发Java的程序员 一想到导入项目 首先是Import 但是发现点击import后 导入不了go项目 所以采用新建的方式来导入Go项目 这个前提是要搭建好Eclipse中Go开发环境 这些有很多可以百度 这里只描述Go项目
  • 数据结构静态顺序表

    顺序表 用一段地址连续存储单元依次存储数据元素的线性结构 seqlist h pragma once 防止头文件重复包含 define MAX SIZE 10 include
  • 结构体中的函数指针

    C语言中的类 大家知道C 是面向对象的语言 有很多优良特性 而在C语言中 我们也可以用结构体类似的实现面向对象 成员函数 既然说了用结构体类似的实现某种类 结构体中的变量就可以看做类的变量 实现类的成员函数就要用到函数指针了 一般的函数指针
  • Go语言学习9-结构体类型

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

    添加国内镜像加速 七牛云 七牛云镜像 全球CDN加速 全球CDN加速 打开你的命令终端输入Go 1 13 及以上 推荐 go env w GO111MODULE on go env w GOPROXY https goproxy cn di
  • C语言中的结构体(struct)

    C语言中 结构体类型属于一种构造类型 其他的构造类型还有 数组类型 联合类型 本文主要介绍关于结构体以下几部分 1 概念 为什么要有结构体 因为在实际问题中 一组数据往往有很多种不同的数据类型 例如 登记学生的信息 可能需要用到 char型
  • GO学习 --- 匿名函数

    一 匿名函数 Go支持匿名函数 如果我们某个函数只是希望使用一次 可以考虑使用匿名函数 匿名函数也可以实现多次调用 二 使用方式 方式一 在定义匿名函数时就直接调用 匿名函数 package main import fmt func mai
  • go语言exec包调用shell命令

    工程中需要用到ffmpeg 想直接用exec包调用shell命令 本来以为很简单 结果折腾了一下午 最后查到了解决方案 假如之前执行报错的语句为 cmd exec Command echo helloworld out err cmd Ou
  • Go语言学习路线

    gogogo git 地址 Go 学习 学习路线 2 基础知识 3 开发工具安装地址 下载 Go基础知识 链接为gitee地址 放心查看 基础结构 learn1 go 基础语法 learn2 go 数据类型 learn3 go 变量 lea
  • go语言实现文件夹上传前后端代码案例

    go语言实现文件夹上传前后端代码案例 前端用于上传的测试界面 如果上传的文件夹有子文件要遍历子文件夹创建出子文件夹再进行拷贝 需要获取文件名和对应的路径 将文件的相对路径和文件对象添加到FormData中 这几行代码很关键 for let

随机推荐

  • 线性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 结构体 结构体类型既可以包含若干个命名元素 又称字段