当前位置: 首页 > news >正文

Go:值与指针

1. 计算机中的值

在百万年的演化历史中,人类对事物的属性进行了抽象,有了数量、精度、信息等概念的表示,对应的我们称之为整数、小数、文本文字等。计算机出现后,我们使用计算机对真实世界的问题进行建模,通过计算机的高效计算解决这些问题并输出答案。为了建模,计算机需要建立对上述基本概念的抽象和表示,于是有了类型与值的概念。

计算机中所有数据都存储在内存中并参与问题解决的计算,真实世界的概念表示与内存中的数据的转换关系如下图:

8dc7feb8e47d0ea0e68ffa352264035c.png

图中的**有界比特序列(bounded bit sequence)就是真实世界概念表示在计算机内存中的存储形式,我们可以统称它为一个值(value)**。这个值的比特序列形式由类型决定。举个例子:一个公司的员工数量为1000人,这个真实世界的概念在计算机中的表示过程如下:

5fc97559d94f9d5a684cd7fe0aafde9a.png

我们用uint16类型来表示员工数量,这样它在内存存储形式为0000 0011 1110 1000。如果你用不同的类型来表示员工数量,那么在内存中表示员工数量的值的比特序列将是不同的。

反之,对于内存中的一段有界比特序列,在不同类型guided的decode下,得到的结果也是不同的,如下图。

f17524820c0655e2126fb200f6722a0a.png

我们看到:在uint64的guided下,0000 0011 1110 1000这个比特序列被解释为1000;而在[2]byte的guided下,0000 0011 1110 1000这个同样的比特序列则被解释成了2个数字。

计算机中的值不仅仅可以表示一个数字,也可以表示一个字符串,甚至是像结构体这样的复合类型,它本质上就是一块儿连续的内存,内存单元是有地址的,通过该地址访问和更新内存单元中的值。

但在编程过程中直接使用内存地址是十分不便的,因此在高级编程语言[1]中,编程语言通过具名的标识符与内存单元建立“绑定”关系,就得到了我们通常说的常量和变量,而内存单元中存储的数据(即值)也可说成是常量持有的数据和变量持有的数据。

当然也有一些不和任何标识符“绑定”的值,我们称之为**字面值(literal value)**。我们通常用字面值为变量和常量赋[初]值:

var a int = 17  
s := "hello"  
const f float64 = 3.1415926

原生类型的字面值,可以简单理解为汇编中的立即数;而复杂类型(比如结构体)的字面值,则一般是临时存储在栈上的有界比特序列。

2. 一切皆是值

根据上一节关于值的定义,我们可以认为:在Go语言中,所有东西都是以值的形式存在的。在Go语言中,不仅仅是基本类型如整数、浮点数、布尔值等,就连复杂的数据结构,如结构体、数组、切片、map、channel等都以值的形式存在。

到这里有小伙伴可能会问:“不对啊,map、channel等应该是指针吧”。别急,要解答这个问题,我们就要来看看值的分类。

2.1 值的分类

在Go中,值可分为以下几种类型:

  • 基本类型值

基本类型是Go语言中最基础的数据类型,它们是直接由语言定义的。基本类型的值通常是简单的值,比如整数、浮点数、布尔值等。在Go语言中,基本类型的值可以进行各种运算和比较操作。

  • 复合类型值

复合类型则是由基本类型组成的更复杂的数据类型。它们的值由多个基本类型值组合而成,并且可以使用结构化的方式进行访问和操作。在Go语言中,复合类型包括分为数组、切片、map、结构体、接口、channel等多种类型。这些复合类型在不同的场景下都有不同的用途,可以用于表示不同的数据结构或者实现不同的算法。

字符串在Go中是一个特殊的存在,从Go类型角度来看,它应该属于原生内置的基本类型,但从值的角度考虑,由于在运行时字符串类型表示为一个两字段的结构(如下)

type StringHeader struct {Data uintptrLen  int
}

因此,我们将其归为复合类型值范畴。

  • 指针类型值

有一类值十分特殊,它自身是一个基本类型值,更准确的说是一个整型值,但这个整型值的含义却是另外一个值所在内存单元的地址。如下图所示:

0904456a85774f598cb5dd4214ef2ba9.png

我们看到:指针类型值为0x12345678,这个值是另外一个内存块(值为0x17)的地址。指针类型值在Go语言以及C、C++这一的静态语言中扮演着极其重要的角色。

回答前面小伙伴的问题:map、channel是不是值? 是值,只不过是指针类型值。从Go语法上来说,map、channel是某个runtime指针类型的实例。

2.2 值的可变性

在继续深入指针之前,我们先来插播一个内容:值的可变性

前面说过值是一段连续内存,是一个有界比特序列。原理上来说,内存中的值都是可变的。但现实中,考虑到操作系统管理以及应用安全的需要,暴露给开发人员的值被做了限定,即有些值(内存单元中的数据)是可变的,而有一些值是不可变的。

首先,操作系统负责物理内存与虚拟内存的映射,应用开发人员面对的是平坦的虚拟内存。这部分平坦的虚拟内存也被分为了几个段(segment),比如:BSS段、数据段、代码段、堆栈等,有些segment上的值是只读的,不可变的,比如代码段,有些则是可读写的可变的,比如堆栈。

此外,Go在编程语言层面也对值做了限制,常量值是不可变的,字符串类型值是不可变的,其他则为可变值。

2.3 指针类型

针对指针这类值,编程语言抽象出了一种类型:指针类型,指针类型的变量与指针类型值绑定,它内部存储的是另外一个内存单元的地址。这样就衍生出通过指针读取和更新指针指向的值的操作方法:

var a int = 5 // 基础类型值
var p = &a    // p为指针类型变量(*int),其值为变量a的地址。println(*p)   // 通过指针读取其指向的变量a的值
*p = 15       // 通过指针更新其指向的变量a的值

不过,指针更大的好处在于传递开销低,且传递后,接收指针的函数/方法体中依然可以修改指针指向的内存单元的值。

接下来,我们来详细说一下值的传递。

2.4. 值的传递

无论是赋值还是传参,Go语言中的所有值的传递的方法都是值拷贝,也称为**逐位拷贝(bitwise copy)**。

不过即便是值拷贝,也会带来三种不同效果:

f351110fdacd2610e8763341b1de860d.png

  • 传值:你是你,我是我

效果:传递前后的变量各自独立更新,互不影响。

示例:传整型、浮点型、布尔值等。

  • 传指针:你是你,我是我,但我们共同指向他

效果:传递前后的指针变量拥有相同的指针值,因此共同指向同一个内存对象(d)。通过其中一个指针变量对指向的内存对象进行更新后(e),另一个指针变量可以感知到相同的变化。

示例:传*T指针类型变量。包括在Go runtime层面本质是一个指针的类型,比如map、channel等。

  • 传“引用”:你是你,我是我,但我们有一部分共同指向他

首先要注意,Go语言规范中没有“引用类型”这一表述。其次,也不要将这里的“引用”与其他语言的“引用类型”相提并论。

这里传“引用”的效果是:传递前后的变量一部分是独立更新互不影响的,一部分则是有共同指向,相互影响的。最典型的例子就是切片。当我们将切片传入函数后,函数内对切片的更新操作会影响到原切片,包括更新切片元素的值、向切片追加元素等。尤其是向切片追加(append)元素后,会导致传递前后的两个切片出现“不一致”,详情可以参考我之前写的一篇文章《当函数设计遇到切片》[2]

这里之所以使用的“引用”来形容这种效果,主要是像slice这样的类型与我们熟知的其他语言中的引用(reference)很像,都是它们以“值”的形态传递,但却能干着“指针”的活儿。

3. 关于值的一些tips

3.1 零值

在Go语言中,每个变量都有一个默认的零值,即在变量未被初始化时的默认值。这个默认值取决于变量的类型,可以是一个数字、布尔值、字符串、指针、数组、结构体等等。

在Go语言中,零值可以用来初始化变量的默认值,也可以用来清空变量的值。

var i int // i的零值为0
var s string // s的零值为""
var p *int // p的零值为nil
var a [3]int // a的零值为[0 0 0]
var b struct { x int; y float64 } // b的零值为{0 0.0}

在这个例子中,我们使用var关键字声明了5个变量,并使用它们的零值来初始化这些变量的值。

另外,我们可以使用零值来清空变量的值,例如:

var i int = 10 // 初始化i的值为10
i = 0 // 使用i的零值来清空它的值

在使用零值时,需要注意以下两个问题:

  • 指针类型的零值为nil,不能直接使用nil指针来访问变量的值,否则会导致panic。

  • 可声明零长度数组类型,这样的类型的实例不占用内存空间,这在一些特殊场合下会很有用。

3.2 值的比较

Go语言的值比较是通过比较两个值的二进制表示来实现的。在Go语言中,值比较主要用于判断两个值是否相等。下面是Go语言值比较的场景、规则和注意事项:

场景

  • 判断两个值是否相等;

  • 判断两个值是否不相等;

  • 判断一个值是否为nil;

  • 判断两个指针是否指向同一个对象。

规则

  • 对于基本类型(如int、float、bool等),只需要比较它们的值就可以了;

  • 对于复合类型(如数组、切片、map等),需要递归比较它们的元素或键值对;

  • 对于结构体类型,需要递归比较它们的字段;

  • 对于接口类型,需要判断它们是否指向同一个动态类型以及动态值是否相等。

注意事项

  • 对于浮点数类型,不能使用“==”运算符进行比较,因为浮点数的精度问题可能导致比较结果不正确,应该使用math包中的函数进行比较;

  • 对于切片类型,Go不支持直接使用“==”运算符进行比较,因为它们的底层数据结构可能不同,应该使用reflect包中的函数DeepEqual进行比较;

  • 对于结构体类型,如果其中包含不可比较的字段(如切片、映射、函数等),则整个结构体类型也是不可比较的;

  • 对于指针类型,需要注意空指针的情况,应该先判断指针是否为nil,再进行比较。

3.3 method receiver的值与指针类型的选择

在Go语言中,method receiver可以是值类型或指针类型。这个选择可能会影响代码的性能、正确性和可读性等方面。

当一个方法的receiver是一个值类型时,receiver的传递会出现“传值”效果,方法体中对这个值的修改不会影响原来的值。但是,如果这个值类型的对象非常大,每次调用方法都需要进行复制,这会导致一定的性能损失。

当一个方法的receiver是一个指针类型时,这个方法操作的就是原来的对象,并且可以修改原来的对象。这种方式可以避免复制对象的开销,并且可以访问和修改对象的内部状态。但是,如果多个goroutine同时访问同一个对象时,就会发生竞争条件,导致程序出现不可预料的行为。

在选择method receiver的类型时,可考虑以下几个因素:

  • 对象的大小:如果对象很小,可以选择值类型的method receiver,避免复制对象的开销;如果对象很大,可以选择指针类型的method receiver,避免复制整个对象的开销。

  • 对象的可变性:如果对象需要被修改,应该选择指针类型的method receiver;如果对象不需要被修改,可以选择值类型的method receiver,保证代码的可预测性和可读性。

  • 对象类型或对象的指针类型是否需要实现特定的接口。

注:关于method receiver的类型选择问题,在《Go语言第一课》专栏[3]的第25讲有系统的讲解。

3.4 使用unsafe.Pointer进行不同type guided的值decode

前面说过,值是一个“有界比特序列”,在不同类型guided的decode下,得到的结果也是不同的。我们可以通过unsafe.Pointer来进行不同的decode,比如下面例子将一个uint32的值重新分别decode为一个[2]uint16和[4]uint8数组:

package mainimport ("fmt""unsafe"
)func main() {var a uint32 = 0x12345678b := (*[2]uint16)(unsafe.Pointer(&a))c := (*[4]uint8)(unsafe.Pointer(&a))fmt.Println(*b) // [22136 4660]fmt.Println(*c) // [120 86 52 18]
}

4. 小结

本文对Go语言中值做了重新解读,我们认为Go中的值就是一个**有界比特序列(bounded bit sequence)**,是真实世界概念表示在计算机内存中的存储形式。

围绕着值这个概念,我们指出Go中一切皆是值。在这一观点的基础上,重新了解了值的分类、值的可变性、指针类型以及重要的值的传递,学习了值的传递的本质:bitwise-copy,以及这个传递过程针对不同类型值所取得的不同效果。

最后,我们了解了一些与值有关的tips,包括零值、值比较、method receiver类型选择以及值decode。


“Gopher部落”知识星球[4]旨在打造一个精品Go学习和进阶社群!高品质首发Go技术文章,“三天”首发阅读权,每年两期Go语言发展现状分析,每天提前1小时阅读到新鲜的Gopher日报,网课、技术专栏、图书内容前瞻,六小时内必答保证等满足你关于Go语言生态的所有需求!2023年,Gopher部落将进一步聚焦于如何编写雅、地道、可读、可测试的Go代码,关注代码质量并深入理解Go核心技术,并继续加强与星友的互动。欢迎大家加入!

225daeb022408b26c1095d92a1948702.png

cd163421b4cf358b31a1a85517fb5379.png

3de2c4938702b01d8f2c96ed167b9a44.png

23012431baa06aaf8e858414f77a5cc5.jpeg

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址[5]:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻)归档仓库 - https://github.com/bigwhite/gopherdaily

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx

  • 微博2:https://weibo.com/u/6484441286

  • 博客:tonybai.com

  • github: https://github.com/bigwhite


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

参考资料

[1] 

高级编程语言: https://en.wikipedia.org/wiki/High-level_programming_language

[2] 

《当函数设计遇到切片》: https://tonybai.com/2022/10/27/when-encountering-slice-during-function-design

[3] 

《Go语言第一课》专栏: http://gk.link/a/10AVZ

[4] 

“Gopher部落”知识星球: https://wx.zsxq.com/dweb2/index/group/51284458844544

[5] 

链接地址: https://m.do.co/c/bff6eed92687

相关文章:

Go:值与指针

1. 计算机中的值 在百万年的演化历史中,人类对事物的属性进行了抽象,有了数量、精度、信息等概念的表示,对应的我们称之为整数、小数、文本文字等。计算机出现后,我们使用计算机对真实世界的问题进行建模,通过计算机的…...

【Linux】进程学习(2)---理解进程操作

文章目录 查看进程通过系统目录查看通过ps命令查看 通过系统调用获取进程标识符通过系统调用创建进程初识fork函数fork函数的返回值 进程状态阻塞与运行状态Linux内核源码中的进程状态运行状态-R浅度睡眠状态-S深度睡眠状态-D暂停状态-T僵尸状态-Z死亡状态-X 查看进程 通过系统…...

基于springcloud实现的医院信息系统

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 医疗信息就诊系统,系统主要功能按照数据流量、流向及处理过程分为临床诊疗、药品管理、财务管理、患者管理。诊疗活动由各工作站配合完成,并将临床信息进行整理、处理、汇总、统计、分析等。本系统包括以…...

设计模式-创建型模式-(工厂、简单工厂、抽象工厂)

一、简单工厂模式 上代码 public class FoodFactory {public static Food makeFood(String name) {if (name.equals("noodle")) {Food noodle new LanZhouNoodle();noodle.addSpicy("more");return noodle;} else if (name.equals("chicken")…...

JAVA12新特性

JAVA12新特性 概述 2019年3月19日,java12正式发布了,总共有8个新的JEP(JDK Enhancement Proposals) JDK 12 is the open-source reference implementation of version 12 of the Java SE12 Platform as specified by by JSR 386 in the Java Community Process. JDK 12 reac…...

Nginx 静态文件、反向代理、负载均衡、缓存、SSL/TLS 加密、gzip 压缩 等等

Nginx的功能 1. 静态文件服务器2. 反向代理服务器3. 负载均衡4. 缓存5. SSL/TLS 加密6. URL 重写7. HTTP/28. WebSocket9. 反向代理缓存10. 安全限制11. gzip 压缩12. 请求限速13. 日志记录14. SSL 证书续订 Nginx 是一个高性能的开源 Web 服务器和反向代理服务器,它…...

Linux设备驱动模型(一)

一、sysfs文件系统 sysfs是一个虚拟文件系统,将内核总的设备对象的链接关系,以文件目录的方式表示出来,并提对设备提供读写接口。 二、kobject kobject是内核中对象表示的基类,可以认为所有的内核对象都是一个kobject kobject单…...

【Python入门篇】——Python基础语法(标识符与运算符)

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句…...

扩展 VirtualBox 已分配磁盘的方法

扩展 VirtualBox 已分配磁盘的方法 第一步:用VirtualBox命令行调整已分配磁盘的大小第二步:用windows磁盘管理工具扩展磁盘空间其他无关配置如何选择虚拟机的芯片组 注意:扩展操作只支持 vdi 格式的磁盘,就是VirtualBox自己的磁盘…...

【LeetCode】646. 最长数对链

646. 最长数对链(中等) 思路 这道题和 300. 最长递增子序列 类似,我们可以定义 dp 数组,其中 dp[i] 表示以 i 结尾的子序列的性质。在处理好每个位置后,统计一遍各个位置的结果即可得到题目要求的结果。 但是题目中强…...

Makefile教程(Makefile的结构)

文章目录 前言一、Makefile的结构二、深入案例三、Makefile中的一些技巧总结 前言 一、Makefile的结构 Makefile 通常由一系列规则组成,每条规则定义了如何从源文件生成目标文件。每个规则又由目标、依赖和命令三部分组成。 下面是 Makefile 规则的基本结构&…...

SpringMVC(后)SSM整合

10、文件上传和下载 10.1、文件下载 ResponseEntity用于控制器方法的返回值类型&#xff0c;该控制器方法的返回值就是响应到浏览器的响应报文 使用ResponseEntity实现下载文件的功能 RequestMapping("/testDown") public ResponseEntity<byte[]> testResp…...

【博弈论】【第一章】博弈论导论

博弈论导论 【例题】选择数字【例题】巴什博弈【例题】射手博弈博弈论的基本概念&#xff1a;参与人战略行动信息支付函数【例题】分100元 课程概述&#xff1a; 【例题】选择数字 两个参与人A和B&#xff0c;轮流选择[3,4,5,6,7,8,9]中的一个整数&#xff08;可重复)。当累计…...

keil移植linux(makefile)

文章目录 运行环境&#xff1a;1.1 freeRTOS_LED工程移植1)修改cubeMX配置2)setting设置3)launch设置4)修改makefile5)修改代码6)实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 stlink 9-24v可调电源 robomaster A 板 1.1 freeRTOS_L…...

C++——类和对象(3)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月6日 内容&#xff1a;C类和对象内容讲解 目录 前言&#xff1a; 1.运算符重载&#xff08;续&#xff09;&#xff1a; 2.赋值重载&#xff1a; 结尾&#xff1a; 前言&#xff1a; 在上一篇博客中我们再一次讲解了…...

itop-3568开发板驱动学习笔记(24)设备树(三)时钟实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 生产者属性#clock-cells 属性clock-output-namesclock-frequencyassigned-clockclock-indicesassigned-clock-parents 消费者属性 设备树中的时钟信息以时钟树形式体现&#xff0c;时钟树包括时钟的属性和结…...

linux中使用docker部署微服务

目录 一、制作jar包&#xff08;如果看一眼很简单&#xff0c;可以直接使用结尾的jar&#xff09; 1.首先创建一个微服务 demo2 2.启动微服务&#xff08;在DemoApplication上右键执行启动就行&#xff09; 注意&#xff1a;其他操作导致的 可能遇到的报错 3.修改端口 4.新…...

操作系统考试复习—第三章 优先级倒置 死锁问题

当前OS广泛采用优先级调度算法和抢占方式&#xff0c;然而在系统中存在着影响进程运行的资源从而可能产生"优先级倒置"现象 具体解释为&#xff1a;在原本的调度算法设计中&#xff0c;高优先级进程可以抢占低优先级的CPU资源&#xff0c;先执行高优先级任务。但是存…...

OpenHarmony送显流程分析

OpenHarmony送显流程分析 引言 本文档主要记录OpenHarmony在渲染完成之后如何进行合成和送显流程的。这个过程牵涉的代码很多&#xff0c;而且流程也是比较繁琐的。所以我一定要坚持下来。千万不能半途而废&#xff0c;也不要想着一口气吃出一个胖子&#xff0c;路漫漫其修远兮…...

Java面试题字节流字符流

String 编码UTF-8 和GBK的区别 GBK编码&#xff1a;是指中国的中文字符&#xff0c;其实它包含了简体中文与繁体中文字符&#xff0c;另外还有一种字符 “gb2312”&#xff0c;这种字符仅能存储简体中文字符。 UTF-8编码&#xff1a;它是一种全国家通过的一种编码&#x…...

Self-Attention结构细节及计算过程

一、结构 上面那个图其实不是那么重要&#xff0c;只要知道将输入的x矩阵转换成三个矩阵进行计算即可。自注意力结构的输入为 输入矩阵的三个变形 Q&#xff08;query矩阵&#xff09;、K&#xff08;key矩阵&#xff09;、V&#xff08;value矩阵&#xff09;构成&#xff0c;…...

在Ubuntu18.04中安装uWebSockets库

目录 1.下载uWebSockets库2.下载uSockets3.安装openssl开发包4.编译首先说明这里使用的Ubuntu版本为18.04。 1.下载uWebSockets库 下载uWebSockets库有两种方式,一是终端,从Github中克隆uWebSockets库到Ubuntu本地文件夹,二是打开uWebSockets库下载链接自己下载到Windows,然…...

【Fluent】接着上一次计算的结果继续计算,利用计算过程中得到的物理场(温度、速度、压力等)插值Interpolate文件初始化模型的方法

一、问题背景 因为fluent中支持的初始化无非三种类型。 1、Standard initialization 标准初始化 2、Hybridinitialization 混合初始化 3、FMG initialization FMG初始化 另外&#xff0c;还可以用UDF通过坐标判断的方式予以初始化。 但是这些初始化方法都没办法利用以前计算过…...

第二十九章 使用消息订阅发布实现组件通信

PubSubJS库介绍 如果你想在React中使用第三方库来实现Pub/Sub机制&#xff0c;PubSubJS是一个不错的选择。它是一个轻量级的库&#xff0c;可以在浏览器和Node.js环境中使用。 PubSubJS提供了一个简单的API&#xff0c;可以让你在应用程序中订阅和发布消息。你可以使用npm来安…...

Transformer的位置编码

1. 什么是位置编码&#xff0c;为什么要使用位置编码 简单来说位置编码就是给一个句子中的每个token一个位置信息&#xff0c;通过位置编码可以明确token的前后顺序关系。 对任何语言来说&#xff0c;句子中词汇的顺序和位置都是非常重要的。它们定义了语法&#xff0c;从而定…...

Python学习简记

做题时遇到的不知道的知识点会更新在此&#xff1a; python中的int()函数可以用于进制转换 该函数最为常见的使用是用于强制类型转换&#xff0c;实际上&#xff0c;它可以有两个参数 值得强调的是当传入两个参数时第一个参数一定要是字符串类型 字符串方法&#xff1a; lower(…...

windows搭建一个FTP服务器超详细

一.场景&#xff1a; 在开发过程中需要FTP文件上传下载功能&#xff0c;需要在本地或者服务器上搭建一个FTP服务器。 二.详细步骤&#xff1a; 1. 安装FTP服务器支持和配置IIS web服务器 打卡“启动关闭Window功能” 控制面板>程序>启动或关闭Windows功能 或者选择快…...

u01使用率100%报错归档满的问题

今天下午客户报数据库无法连接了&#xff0c;我也立刻登录查看 因为显示orcl1归档满了&#xff0c;我就登录查看磁盘组的空间&#xff0c;发现空间空余很多 就sqlpus登录了&#xff0c;发现u01使用率满了 [oracledb1 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 …...

Packet Tracer - 配置扩展 ACL - 场景 2

Packet Tracer - 配置扩展 ACL - 场景 2 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.101.117.49 255.255.255.248 不适用 G0/1 10.101.117.33 255.255.255.240 不适用 G0/2 10.101.117.1 255.255.255.224 不适用 PCA NIC 10.101…...

最近面了12个人,发现这个测试基础题都答不上来...

一般面试我都会问一两道很基础的题目&#xff0c;来考察候选人的“地基”是否扎实&#xff0c;有些是操作系统层面的&#xff0c;有些是 python语言方面的&#xff0c;还有些… 深耕IT行业多年&#xff0c;我们发现&#xff0c;对于一个程序员而言&#xff0c;能去到一线互联网…...

如何快速自己做网站/网络销售怎么聊客户

转载至&#xff1a;http://blog.csdn.net/denglxsc/article/details/51188444 在开发过程中对程序方法、类的描述不仅方便阅读、更能体现一个良好的编码习惯&#xff0c;但是自带的文档注释快捷键以及自动生成的注释总是不够完美&#xff0c;既然不完美&#xff0c;那么我们就…...

阿里云ecs 怎么做网站/百度搜索引擎工作原理

2019独角兽企业重金招聘Python工程师标准>>> 第一步&#xff1a;安装Git 第二步&#xff1a;在自己的工程目录下右键鼠标 选择 Git Bash Here 执行命令 git init 来创建一个本地代码仓库 执行命令 git add . 来把所有文件添加到仓库 执行命令 git commit -m "f…...

建设一个自己的网站首页/网络营销推广工具

由于国内Android市场众多渠道&#xff0c;为了统计每个渠道的下载及其它数据统计&#xff0c;就需要我们针对每个渠道单独打包&#xff0c;如果让你打几十个市场的包岂不烦死了&#xff0c;不过有了Gradle&#xff0c;这再也不是事了。 友盟多渠道打包 废话不多说&#xff0c…...

网络直播网站开发/河南seo外包

c语言大作业题目201008一、学生信息管理程序基本要求&#xff1a;1&#xff0e;要求实现学生信息的查找、添加、删除、修改、浏览、保存、从文件读取、查看奖学金信息8个功能&#xff0c;每个功能模块均能实现随时从模块中退出&#xff0c;而且可以选择不同的方式实现所需功能&…...

长安网站建设好吗/互联网金融

2019独角兽企业重金招聘Python工程师标准>>> 一、 整体诉说&#xff1a; 1.ArrayList是不固定的&#xff0c;比如用sql查询数据库&#xff0c;不知道有多少记录返回&#xff0c;用Arraylist。 2.HashMap/Hashtable 和 Vector/ArrayList 都是放一组对象&#xff0c;…...

做视频网站的公司有哪些/登封网站设计

使用flume收集数据&#xff0c;将数据传递给kafka和hdfs&#xff0c;kafka上的数据可以使用storm构建实时计算&#xff0c;而hdfs上的数据&#xff0c;经过MR处理之后可以导入hive中进行处理。 环境&#xff1a;hadoop1.2.1&#xff0c;hive 0.13.1&#xff0c;maven 3.2.5&…...