【零基础入门Go语言】struct 和 interface:Go语言是如何实现继承的?
提到面向对象编程中的继承,许多人脑海中可能会浮现出 Java、C++ 等语言中那一套熟悉的类继承体系。然而,Go 语言作为一门别具一格的编程语言,并没有遵循传统的继承模式。那么,在 Go 语言的世界里,它是怎样实现类似于继承的功能,让代码变得更加高效和灵活的呢?这就不得不深入探讨 Go 语言中的 struct 和 interface 了。接下来,就让我们一同开启这段探索之旅。
结构体
结构体(Struct)是一种聚合类型,里面可以包含任意类型的值,这些值就是我们定义的结构体的成员,也称为字段。在 Go语言中,要自定义一个结构体,需要使用 type+struct
关键字组合。
type person struct {name stringage int
}// 通用格式
type structName struct {fieldName typeName
}
在定义结构体时,字段的声明方法与平时声明一个变量是一样的,都是变量名在前,类型在后,只不过在结构体中,变量名称为成员名或字段名。
结构体的成员字段并不是必需的,也可以一个字段都没有,这种结构体称为空结构体。空结构体在 Go语言中是一个比较神奇且全能的存在,我们在实际开发时经常会用到这个东西,后面会专门做内容讲解空结构体的相关点。
结构体也是一种类型,所以对于以后自定义的结构体,我会称为某结构体或某类型,两者是一个意思。比如person结构体和person类型其实是一个意思。
定义好结构体后就可以使用它了,因为它是一个聚合类型,所以可以比普通的类型携带更多数据。
声明和使用
结构体类型也可以使用与普通的字符串、整型一样的方式进行声明和初始化。
// 完整声明
// 声明后未初始化时,默认会使用结构体里字段的零值。
var p person// 简短声明
p := person{"随便寻个地方", 22}
采用字面量初始化结构体时,初始化值的顺序很重要,必须与字段定义的顺序一致。那么是否可以不按照顺序初始化呢?当然可以,只不过需要指出字段名称。
p := person{age:22, name:"随便寻个地方"}
当然你也可以只初始化字段age,字段name使用默认的零值,如下面的代码所示,仍然可以编译通过。
p := person{age:22}
声明了一个结构体变量后就可以使用它了。在Go语言中,访问一个结构体的字段与调用一个类型的方法一样,都是使用点操作符 “.”。
fmt.Println(p.name, p.age)
结构体中的字段
结构体的字段可以是任意类型,包括自定义的结构体类型,比如下面的代码:
type person struct {name stringage intaddr address
}type address struct {province stringcity string
}
通过这种方式,用代码描述现实中的实体会更匹配,复用程度也更高。对于嵌套结构体字段的结构体,其初始化与正常的结构体大同小异,只需要根据字段对应的类型初始化即可。
p:=person{age:30,name:"飞雪无情",addr:address{province: "北京",city: "北京",},
}
如果需要访问结构体最里层的 province 字段的值,同样也可以使用点操作符,只不过需要使用两个点。
// 第一个点获取 addr,第二个点获取 addr 的 province。
fmt.Println(p.addr.province)
接口
接口是和调用方的一种约定,它是一个高度抽象的类型,不用和具体的实现细节绑定在一起。接口要做的是定义好约定,告诉调用方自己可以做什么,但不用知道它的内部实现,这和我们见到的具体的类型如 int、map、slice 等不一样。
接口的定义和结构体稍微有些差别,虽然都以 type
关键字开始,但接口的关键字是 interface,表示自定义的类型是一个接口。也就是说 Stringer
是一个接口,它有一个方法 String() string
。
type Stringer interface {String() string
}
针对 Stringer 接口来说,它会告诉调用者可以通过它的 String() 方法获取一个字符串,这就是接口的约定。至于这个字符串怎么获得的,长什么样,接口不关心,调用者也不用关心,因为这些是由接口实现者来做的。
接口的实现
接口的实现者必须是一个具体的类型,继续以 person 结构体为例,让它来实现 Stringer 接口。
func (p person) String() string{return fmt.Sprintf("the name is %s,age is %d",p.name,p.age)
}
给结构体类型 person 定义一个方法,这个方法和接口里方法的签名(名称、参数和返回值)一样,这样结构体 person 就实现了 Stringer 接口。
注意:如果一个接口有多个方法,那么需要实现接口的每个方法才算是实现了这个接口。
实现了 Stringer 接口后就可以使用了。
func printString(s fmt.Stringer){fmt.Println(s.String())
}
这个被定义的函数 printString
,它接收一个 Stringer
接口类型的参数,然后打印出 Stringer
接口的 String
方法返回的字符串。
printString
这个函数的优势就在于它是面向接口编程的,只要一个类型实现了 Stringer
接口,都可以打印出对应的字符串,而不用管具体的类型实现。
因为 person
实现了 Stringer
接口,所以变量 p 可以作为函数 printString
的参数,可以用如下方式打印:
printString(p)
结果为:
the name is 随便寻个地方,age is 22
现在让结构体 address 也实现 Stringer 接口,如下面的代码所示:
func (addr address) String() string{return fmt.Sprintf("the addr is %s%s",addr.province,addr.city)
}
因为结构体 address 也实现了 Stringer 接口,所以 printString 函数不用做任何改变,可以直接被使用,打印出地址。
printString(p.addr)
//输出:the addr is 北京北京
这就是面向接口的好处,只要定义和调用双方满足约定,就可以使用,而不用管具体实现。接口的实现者也可以更好的升级重构,而不会有任何影响,因为接口约定没有变。
值接收者和指针接收者
我们已经知道,如果要实现一个接口,必须实现这个接口提供的所有方法,而且在上一章讲解方法的时候,我们也知道定义一个方法,有值类型接收者和指针类型接收者两种。二者都可以调用方法,因为Go语言编译器自动做了转换,所以值类型接收者和指针类型接收者是等价的。但是在接口的实现中,值类型接收者和指针类型接收者不一样,下面我会详细分析二者的区别。
在上一小节中,已经验证了结构体类型实现了Stringer接口,那么结构体对应的指针是否也实现了该接口呢?我通过下面这个代码进行测试:
printString(&p)
测试后会发现,把变量 p 的指针作为实参传给 printString
函数也是可以的,编译运行都正常。这就证明了以值类型接收者实现接口的时候,不管是类型本身,还是该类型的指针类型,都实现了该接口。
示例中值接收者(p person)实现了 Stringer
接口,那么类型 person
和它的指针类型 *person
就都实现了 Stringer
接口。
现在,我把接收者改成指针类型,如下代码所示:
func (p *person) String() string{return fmt.Sprintf("the name is %s,age is %d",p.name,p.age)
}
修改成指针类型接收者后会发现,示例中这行printString§代码编译不通过,提示如下错误:
./main.go:17:13: cannot use p (type person) as type fmt.Stringer in argument to printString:person does not implement fmt.Stringer (String method has pointer receiver)
意思就是类型 person
没有实现 Stringer
接口。这就证明了以指针类型接收者实现接口的时候,只有对应的指针类型才被认为实现了该接口。
我用如下表格为你总结这两种接收者类型的接口实现规则:
方法接收者 | 实现接口的类型 |
---|---|
(p person) | person 和 *person |
(p *person) | *person |
- 当值类型作为接收者时,
person
类型和*person
类型都实现了该接口。 - 当指针类型作为接收者时,只有
*person
类型实现了该接口。
可以发现,实现接口的类型都有 *person
,这也表明指针类型比较万能,不管哪一种接收者,它都能实现该接口。
继承和组合
在 Go语言中没有继承的概念,所以结构体、接口之间也没有父子关系,Go语言提倡的是组合,利用组合达到代码复用的目的,这也更灵活。
我们以 Go 语言 io 标准包自带的接口为例,讲解类型的组合(也可以称之为嵌套)。
type Reader interface {Read(p []byte) (n int, err error)
}type Writer interface {Write(p []byte) (n int, err error)
}//ReadWriter是Reader和Writer的组合
type ReadWriter interface {ReaderWriter
}
ReadWriter
接口就是 Reader
和 Writer
的组合,组合后,ReadWriter
接口具有 Reader
和 Writer
中的所有方法,这样新接口 ReadWriter
就不用定义自己的方法了,组合 Reader
和 Writer
的就可以了。
不止接口可以组合,结构体也可以组合,现在把 address
结构体组合到结构体 person
中,而不是当成一个字段。
type person struct {name stringage uintaddress
}
直接把结构体类型放进来,就是组合,不需要字段名。组合后,被组合的 address
称为内部类型,person
称为外部类型。修改了 person
结构体后,声明和使用也需要一起修改。
p:=person{age:30,name:"飞雪无情",address:address{province: "北京",city: "北京",},}
//像使用自己的字段一样,直接使用
fmt.Println(p.province)
因为 person
组合了 address
,所以 address
的字段就像 person
自己的一样,可以直接使用。
类型组合后,外部类型不仅可以使用内部类型的字段,也可以使用内部类型的方法,就像使用自己的方法一样。如果外部类型定义了和内部类型同样的方法,那么外部类型的会覆盖内部类型,这就是方法的覆写。关于方法的覆写,这里不再进行举例,你可以自己试一下。
小提示:方法覆写不会影响内部类型的方法实现。
类型断言
有了接口和实现接口的类型,就会有类型断言。类型断言用来判断一个接口的值是否是实现该接口的某个具体类型。
还是以我们上面小节的示例演示,我们先来回忆一下它们,如下所示:
func (p *person) String() string{return fmt.Sprintf("the name is %s,age is %d",p.name,p.age)
}func (addr address) String() string{return fmt.Sprintf("the addr is %s%s",addr.province,addr.city)
}
可以看到,*person
和 address
都实现了接口 Stringer
,然后我通过下面的示例讲解类型断言:
var s fmt.Stringer
s = p1
p2 := s.(*person)
fmt.Println(p2)
如上所示,接口变量 s 称为接口 fmt.Stringer
的值,它被 p1 赋值。然后使用类型断言表达式 s.(*person)
,尝试返回一个 p2。如果接口的值 s 是一个 *person
,那么类型断言正确,可以正常返回 p2。如果接口的值 s 不是一个 *person
,那么在运行时就会抛出异常,程序终止运行。
小提示:这里返回的 p2 已经是 *person 类型了,也就是在类型断言的时候,同时完成了类型转换。
在上面的示例中,因为 s 的确是一个 *person
,所以不会异常,可以正常返回 p2。但是如果我再添加如下代码,对 s 进行 address
类型断言,就会出现一些问题:
a:=s.(address)
fmt.Println(a)
这个代码在编译的时候不会有问题,因为 address
实现了接口 Stringer
,但是在运行的时候,会抛出如下异常信息:
panic: interface conversion: fmt.Stringer is *main.person, not main.address
这显然不符合我们的初衷,我们本来想判断一个接口的值是否是某个具体类型,但不能因为判断失败就导致程序异常。考虑到这点,Go 语言为我们提供了类型断言的多值返回,如下所示:
a,ok:=s.(address)
if ok {fmt.Println(a)
}else {fmt.Println("s不是一个address")
}
类型断言返回的第二个值 “ok” 就是断言是否成功的标志,如果为 true 则成功,否则失败。
总结
这节课虽然只讲了结构体和接口,但是所涉及的知识点很多,并且非常杂乱,需要深入地学习。且由于涉及到面向对象相关的内容,在面试的时候很有可能会被问到一些比较复杂的问题,这些在后面都会一一讲解。
结构体是对现实世界的描述,接口是对某一类行为的规范和抽象。通过它们,我们可以实现代码的抽象和复用,同时可以面向接口编程,把具体实现细节隐藏起来,让写出来的代码更灵活,适应能力也更强。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
【零基础入门Go语言】struct 和 interface:Go语言是如何实现继承的?
提到面向对象编程中的继承,许多人脑海中可能会浮现出 Java、C 等语言中那一套熟悉的类继承体系。然而,Go 语言作为一门别具一格的编程语言,并没有遵循传统的继承模式。那么,在 Go 语言的世界里,它是怎样实现类似于继承…...
![](https://i-blog.csdnimg.cn/direct/98ae2e0848fb46f5be79f49a696be728.png)
麦田物语学习笔记:实现拖拽物品交换数据和在地图上生成物品
基本流程 1.代码思路 (1)InventoryUI的PlayerSlots与PlayerBag里一一对应,所以想要实现交换数据实际上是,先拿到被拖拽的物体所对的Slot的序号和目标的Slot序号,然后将这两个序号对调一下 (2)物品交换的数据逻辑应该在InventoryManager里去调用,因为InventoryManager里管理了p…...
![](https://i-blog.csdnimg.cn/direct/4f42d0f662e444a3a36d463d7921f42c.jpeg)
一些计算机零碎知识随写(25年1月)-1
我原以为世界上有技术的那批人不会那么闲,我错了,被脚本真实了。 今天正隔着画画呢,手机突然弹出几条安全告警通知。 急忙打开服务器,发现问题不简单,直接关服务器重装系统..... 首先,不要认为小网站&…...
![](https://i-blog.csdnimg.cn/direct/984fc79c2247401ea15895134ccab8d6.png)
Qt学习笔记第81到90讲
第81讲 串口调试助手实现自动发送 为这个名叫“定时发送”的QCheckBox编写槽函数。 想要做出定时发送的效果,必须引入QT框架下的毫秒级定时器QTimer,查阅手册了解详情。 在widget.h内添加新的私有成员变量: QTimer *timer; 在widget类的构造…...
![](https://www.ngui.cc/images/no-images.jpg)
Centos9 + Docker 安装 MySQL8.4.0 + 定时备份数据库到本地
Centos9 Docker 安装 MySQL8.4.0 定时备份数据库到本地 创建目录,创建配置文件启动容器命令定时备份MySQL执行脚本Linux每日定时任务命令文件内参数其他时间参数 AT一次性定时任务 创建目录,创建配置文件 $ mkdir -p /opt/mysql/conf$ vim /opt/mysql/…...
![](https://i-blog.csdnimg.cn/direct/d23d4208f7054c5cb70348b66be79a1a.png)
网络原理一>UDP协议详解
UDP和TCP都是应用层中的重要协议,如果做基础架构开发,会用得多一些。 这一篇我们先简单聊一下的UDP TCP格式呈现: 我们知道UDP是一种无连接,面向数据报,全双工,不可靠传输特性的网络协议。 基本格式如图…...
![](https://i-blog.csdnimg.cn/direct/2312d43857b94ebf97bfd4f64fcb967b.png)
MySQL的小问题
编码问题 不管官方使用什么编码:latin1、gbk、utf8、utfmb4。统一使用utfmb4 MySQL中的utf8并不是utf-8,它省略了一个字节,只是用三个字节存储所有的符号,utfmb4才是utf-8 远程登录问题: MySQL官方默认没有启动远程…...
![](https://i-blog.csdnimg.cn/img_convert/c6bba40421aee7fa4fbef5bfca8e9c6d.png)
Mac——Docker desktop安装与使用教程
摘要 本文是一篇关于Mac系统下Docker Desktop安装与使用教程的博文。首先介绍连接WiFi网络,然后详细阐述了如何在Mac上安装Docker,包括下载地址以及不同芯片版本的选择。接着讲解了如何下载基础镜像和指定版本镜像,旨在帮助用户在Mac上高效使…...
![](https://i-blog.csdnimg.cn/direct/c5c70ceda7b4482cbae3a1f7fc53327e.png)
FastApi Swagger 序列化问题
问题 错误现象: fastapi的 swagger 界面无法正常打开控制台报错:raise PydanticInvalidForJsonSchema(fCannot generate a JsonSchema for {error_info}) 详细报错: File "d:\Envs\miniconda3\envs\xdagent\lib\site-packages\pydan…...
![](https://i-blog.csdnimg.cn/direct/433cee489fa1439aaf6ab316c49788e3.png)
《机器学习》——sklearn库中CountVectorizer方法(词频矩阵)
CountVectorizer方法介绍 CountVectorizer 是 scikit-learn 库中的一个工具,它主要用于将文本数据转换为词频矩阵,而不是传统意义上的词向量转换,但可以作为词向量转换的一种基础形式。用于将文本数据转换为词频矩阵,它是文本特征…...
![](https://i-blog.csdnimg.cn/img_convert/d0b897e4aadf7cdc2ea13d5174a60099.png)
UML系列之Rational Rose笔记三:活动图(泳道图)
一、新建活动图(泳道图) 依旧在用例视图里面,新建一个activity diagram;新建好之后,就可以绘制活动图了: 正常每个活动需要一个开始,点击黑点,然后在图中某个位置安放,接…...
![](https://i-blog.csdnimg.cn/img_convert/91fb3d3c48ed8f4f96e5b934a7581ea1.png)
Java面向对象面经总结
目录 面向对象基础 面向对象与面向过程的区别 创建一个对象用什么运算符,对象实体与对象引用的区别 对象相等和引用相等的区别 构造方法的特点,是否可被重写? 面向对象三大特征 封装 继承 多态 接口和抽象类的共同点和区别 深拷贝…...
![](https://www.ngui.cc/images/no-images.jpg)
红队工具使用全解析:揭开网络安全神秘面纱一角
红队工具使用全解析:揭开网络安全神秘面纱一角 B站红队公益课:https://space.bilibili.com/350329294 学习网盘资源链接:https://pan.quark.cn/s/4079487939e8 嘿,各位网络安全爱好者们!在风云变幻的网络安全战场上&am…...
![](https://i-blog.csdnimg.cn/direct/3f00c9d61a0c4d54add12219389beda6.png)
OpenLinkSaas 2025年第一季度开发计划
OpenLinkSaas在2025的发展方向是强化基础设施和研发协作,弱化管理相关的功能。 为了根据参与到软件研发的整个流程,OpenLinkSaas会增加一系列的基础设施项目,并和OpenLinksaas进行深度整合。 目前计划中的基础设施: 链路追踪系统(OpenDragonF…...
![](https://www.ngui.cc/images/no-images.jpg)
【python小工具】怎么获取视频的关键帧频率?
使用 FFmpeg 提取 MP4 视频的关键帧并计算关键帧频率可以按以下步骤进行: 提取关键帧: 使用 FFmpeg 提取视频中的关键帧可以通过以下命令实现: ffmpeg -i input.mp4 -vf "selecteq(pict_type,I)" -vsync vfr keyframes_%03d.jpg…...
![](https://i-blog.csdnimg.cn/img_convert/4403c5ea40b88faea18627228e3e13c8.jpeg)
数字孪生可视化在各个行业的应用场景
数字孪生技术,作为新一代信息技术的集大成者,正在深刻改变着我们对物理世界的认知和管理方式。本文将探讨数字孪生可视化在不同行业的应用场景,以及它们如何赋能行业数字化转型。 1. 智慧城市与交通 在智慧城市领域,数字孪生技术…...
![](https://www.ngui.cc/images/no-images.jpg)
Python实现windows自动关机
python <shut.py> import ntplib from datetime import datetime, timezoneimport time import osimport easygui# net time def get_network_time():time.sleep(3)"""从网络时间服务器获取时间"""client ntplib.NTPClient()response c…...
![](https://www.ngui.cc/images/no-images.jpg)
Go可以使用设计模式,但绝不是《设计模式》中的那样
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
![](https://i-blog.csdnimg.cn/direct/bc73ef2a3b5b4c6fbd9ac7882332095d.png)
【C语言】_使用冒泡排序模拟实现qsort函数
目录 1. 排序函数的参数 2. 排序函数函数体 2.1 比较元素的表示 2.2 交换函数Swap的实现 2.3 排序函数bubble_sort的实现 3. 测试整型数据排序 3.1 整型数据比较函数cmp_int的实现 3.2 整型数据排序后输出函数print_int的实现 3.3 整型数据测试函数test_int的实现 3…...
![](https://i-blog.csdnimg.cn/direct/ffa28748e9c645cfb53af56fbe4f63d0.png)
openCvSharp 计算机视觉图片找茬
一、安装包 <PackageReference Include"OpenCvSharp4" Version"4.10.0.20241108" /> <PackageReference Include"OpenCvSharp4.runtime.win" Version"4.10.0.20241108" /> 二、准备两张图片 三、编写代码 using OpenCv…...
![](https://i-blog.csdnimg.cn/direct/c9ccf4a256454d0daad973d71849c34f.png)
从零开始开发纯血鸿蒙应用之处理外部文件
从零开始开发纯血鸿蒙应用 一、外部文件二、外部文件的访问形式1、主动访问2、被动访问 三、代码实现1、DocumentViewPicker2、Ability Skills3、onNewWant 函数4、冷启动时处理外部文件 一、外部文件 对于移动端app来说,什么是外部文件呢?是那些存储在…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring中三级缓存详细讲解
1、Spring三级缓存是什么,过程是怎么样的? Spring 中的三级缓存主要用于单例 Bean 的生命周期管理,特别是在循环依赖时,它通过不同阶段暴露 Bean 实例来确保依赖注入的顺利完成。缓存的内容如下: 一级缓存 (singleton…...
![](https://i-blog.csdnimg.cn/img_convert/4fda25460f53e8abe1d1f244fb64a17f.png)
论文阅读:《Whole-animal connectomes of both Caenorhabditis elegans sexes》
一 论文整体概述 论文下载链接:《Whole-animal connectomes of both Caenorhabditis elegans sexes》 补充信息和额外数据:https://www.nature.com/articles/s41586-019-1352-7 1. 作者期刊背景 该论文由Scott W. Emmons,David H. Hall等…...
![](https://i-blog.csdnimg.cn/direct/aab11f38adde4fe1b14b03ef9503b77a.png)
嵌入式开发之STM32学习笔记day03
STM32之ADC(模拟数字转换器) 1 ADC简述2 ADC转换时间3 ADC转化结果存放机制4 ADC转化结果存放机制5 ADC电压转换 1 ADC简述 ADC(Analog-Digital Converter)模拟—数字转换器;ADC可以将引脚上连续变化的模拟电压转换为…...
![](https://i-blog.csdnimg.cn/direct/1450691a950c46ea866f27558257159f.png)
windows10 安装 Golang 版本控制工具g与使用
下载包:https://github.com/voidint/g/releases 解压, 并添加到环境变量 g 常用命令 查询当前可供安装的stable状态及所有的 go 版本 # stable 版本 g ls-remote stable# 所有版本 g ls-remote安装目标 go 版本1.23.4g install 1.23.4切换到已安装的…...
![](https://i-blog.csdnimg.cn/img_convert/b8f53426bd0b87653c47cb78ea1f2c56.png)
SpringBoot 使用 Cache 集成 Redis做缓存保姆教程
1. 项目背景 Spring Cache是Spring框架提供的一个缓存抽象层,它简化了缓存的使用和管理。Spring Cache默认使用服务器内存,并无法控制缓存时长,查找缓存中的数据比较麻烦。 因此Spring Cache支持将缓存数据集成到各种缓存中间件中。本文已常…...
![](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fp3-sign.toutiaoimg.com%2Ftos-cn-i-axegupay5k%2F189887ca52044a0bb4699180b4a3d161~tplv-tt-origin-web%3Agif.jpeg&pos_id=6zugGdxZ)
R数据分析:多分类问题预测模型的ROC做法及解释
有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用ROC曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评估指标。那么肯定是统一成ROC了,刚好借这个机会给大家讲讲ROC在多…...
![](https://i-blog.csdnimg.cn/direct/2e90bb6a11a7473582f2ad1ea22a4217.png)
数据结构与算法之二叉树: LeetCode 654. 最大二叉树 (Ts版)
最大二叉树 https://leetcode.cn/problems/maximum-binary-tree/ 描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值递归地在最大值 左边 的 子数组前缀上 构建左子树递归地在最大值…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux 容器漏洞
定义:Linux 容器漏洞是指在容器技术(如 Docker、LXC 等)运行环境中存在的安全弱点。这些漏洞可能存在于容器镜像本身、容器运行时(如 runc)、容器编排工具(如 Kubernetes)或者容器与主机之间的交…...
![](https://www.ngui.cc/images/no-images.jpg)
file与io流(1)
-1- java.io.File类的使用 (1) 概述 File类及本章下的各种流,都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录(俗称文件夹),与平台无关。(体会万事万物皆…...
![](/images/no-images.jpg)
政府网站建设排名/网络推广网上营销
MATLAB 函数编写方法与应用所谓 MATLAB 程序,大致分为两类:M 脚本文件 (M-) 和 M 函数 (M-), 它们均是普通的 ASCII 码构成的文件。M 脚本文件中包含一族由 MATLAB 语言所支持的语句,它类似于 DOS 下的批处理文件,它的执行方式很简…...
![](https://s1.51cto.com/attachment/201005/201005041272980295671.gif)
广州市政府门户网站介绍/简述网络营销的特点
很多搞过数据仓库的朋友曾经问我有没有数据模型的资料,很惭愧,一来是实施项目确实不多;二来就算有也是公司机密的东西,不便泄露;今天登陆到 inmon 的网站,刚好看到这方面的资料,于是就当了下来&…...
![](https://images2015.cnblogs.com/blog/796799/201703/796799-20170320102818174-232623865.png)
北京免费网站开发维护/哈尔滨电话本黄页
Fiddler中设置断点修改Request Fiddler最强大的功能莫过于设置断点了,设置好断点后,你可以修改httpRequest 的任何信息包括host, cookie或者表单中的数据。设置断点有两种方法 第一种:打开Fiddler 点击Rules-> Automatic Breakpoint ->…...
![](/images/no-images.jpg)
今日招聘/上海快速优化排名
理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作:List box ...;Apple apple box.get(0);上面的代码自身已表达的很清楚:box是一个装有Apple对象的List。get方法返回一个Apple对象实例ÿ…...
![](/images/no-images.jpg)
网站怎么添加二级域名/东莞seo推广机构帖子
此篇博客内容均根据Unity官方文档内容翻译并总结而来。官方文档的目录为: UnityManual ---->Bset Practice Guide ----> Understanding Optimization in Unity ----> General Optimization 和 Special Optimization 用户可以自行对文档中的这部分内容进…...
![](/images/no-images.jpg)
wordpress背景图美化/百度热搜榜单
windows是个多用户多任务的操作系统,支持多个程序同时运行,如果你的程序不想让用户同时运行一个以上, 那应该怎样做呢? 本文将介绍避免用户同时运行多个程序的例子。 需要用到的函数CreateMutex ,CreateMutex 函数是…...