游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

golang2021数据格式(59)结构体

  有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号姓名性别年龄地址等属性。显然单独定义以上变量比较繁琐,数据不便于管理。
  结构体是一种聚合的数据类型,它是由一系列具有相同类型或不同类型的数据构成的数据集合。每个数据称为结构体的成员。
  1。结构体
  Go语言中没有类的概念,也不支持类的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。
  1。1。类型别名和自定义类型
  1。1。1。自定义类型
  在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型。
  自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。例如:
  将MyInt定义为int类型
  typeMyIntint
  通过Type关键字的定义,MyInt就是一种新的类型,它具有int的特性。
  1。1。2。类型别名
  类型别名是Go1。9版本添加的新功能。
  类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。
  typeTypeAliasType
  我们之前见过的rune和byte就是类型别名,他们的定义如下:
  typebyteuint8
  typeruneint32
  1。1。3。类型定义和类型别名的区别
  类型别名与类型定义表面上看只有一个等号的差异,我们通过下面的这段代码来理解它们之间的区别。
  类型定义
  typeNewIntint
  类型别名
  typeMyIntint
  funcmain(){
  varaNewInt
  varbMyInt
  fmt。Printf(typeofa:T,a)typeofa:main。NewInt
  fmt。Printf(typeofb:T,b)typeofb:int
  }
  结果显示a的类型是main。NewInt,表示main包下定义的NewInt类型。b的类型是int。MyInt类型只会在代码中存在,编译完成时并不会有MyInt类型。
  1。2。结构体
  Go语言中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct。也就是我们可以通过struct来定义自己的类型了。
  Go语言中通过struct来实现面向对象。
  1。2。1。结构体的定义
  使用type和struct关键字来定义结构体,具体代码格式如下:
  type类型名struct{
  字段名字段类型
  字段名字段类型
  }
  其中:
  1。类型名:标识自定义结构体的名称,在同一个包内不能重复。
  2。字段名:表示结构体字段名。结构体中的字段名必须唯一。
  3。字段类型:表示结构体字段的具体类型。
  举个例子,我们定义一个Person(人)结构体,代码如下:
  typepersonstruct{
  namestring
  citystring
  ageint8
  }
  同样类型的字段也可以写在一行,
  typeperson1struct{
  name,citystring
  ageint8
  }
  这样我们就拥有了一个person的自定义类型,它有name、city、age三个字段,分别表示姓名、城市和年龄。这样我们使用这个person结构体就能够很方便的在程序中表示和存储人信息了。
  语言内置的基础数据类型是用来描述一个值的,而结构体是用来描述一组值的。比如一个人有名字、年龄和居住城市等,本质上是一种聚合型的数据类型
  1。2。2。结构体实例化
  只有当结构体实例化时,才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。
  结构体本身也是一种类型,我们可以像声明内置类型一样使用var关键字声明结构体类型。
  var结构体实例结构体类型
  1。2。3。基本实例化
  typepersonstruct{
  namestring
  citystring
  ageint8
  }
  funcmain(){
  varp1person
  p1。name1cxy。net
  p1。city北京
  p1。age18
  fmt。Printf(p1v,p1)p1{1cxy。net北京18}
  fmt。Printf(p1v,p1)p1main。person{name:1cxy。net,city:北京,age:18}
  }
  我们通过。来访问结构体的字段(成员变量),例如p1。name和p1。age等。
  1。3。匿名结构体
  在定义一些临时数据结构等场景下还可以使用匿名结构体。
  packagemain
  import(
  fmt
  )
  funcmain(){
  varuserstruct{Namestring;Ageint}
  user。Name1cxy。net
  user。Age18
  fmt。Printf(v,user)
  }
  1。3。1。创建指针类型结构体
  我们还可以通过使用new关键字对结构体进行实例化,得到的是结构体的地址。格式如下:
  varp2new(person)
  fmt。Printf(T,p2)main。person
  fmt。Printf(p2v,p2)p2main。person{name:,city:,age:0}
  从打印的结果中我们可以看出p2是一个结构体指针。
  需要注意的是在Go语言中支持对结构体指针直接使用。来访问结构体的成员。
  varp2new(person)
  p2。name测试
  p2。age18
  p2。city北京
  fmt。Printf(p2v,p2)p2main。person{name:测试,city:北京,age:18}
  1。3。2。取结构体的地址实例化
  使用对结构体进行取地址操作相当于对该结构体类型进行了一次new实例化操作。
  p3:person{}
  fmt。Printf(T,p3)main。person
  fmt。Printf(p3v,p3)p3main。person{name:,city:,age:0}
  p3。name博客
  p3。age30
  p3。city成都
  fmt。Printf(p3v,p3)p3main。person{name:博客,city:成都,age:30}
  p3。name博客其实在底层是(p3)。name博客,这是Go语言帮我们实现的语法糖。
  1。3。3。结构体初始化
  typepersonstruct{
  namestring
  citystring
  ageint8
  }
  funcmain(){
  varp4person
  fmt。Printf(p4v,p4)p4main。person{name:,city:,age:0}
  }
  1。3。4。使用键值对初始化
  使用键值对对结构体进行初始化时,键对应结构体的字段,值对应该字段的初始值。
  p5:person{
  name:1cxy。net,
  city:北京,
  age:18,
  }
  fmt。Printf(p5v,p5)p5main。person{name:1cxy。net,city:北京,age:18}
  也可以对结构体指针进行键值对初始化,例如:
  p6:person{
  name:1cxy。net,
  city:北京,
  age:18,
  }
  fmt。Printf(p6v,p6)p6main。person{name:1cxy。net,city:北京,age:18}
  当某些字段没有初始值的时候,该字段可以不写。此时,没有指定初始值的字段的值就是该字段类型的零值。
  p7:person{
  city:北京,
  }
  fmt。Printf(p7v,p7)p7main。person{name:,city:北京,age:0}
  1。3。5。使用值的列表初始化
  初始化结构体的时候可以简写,也就是初始化的时候不写键,直接写值:
  p8:person{
  1cxy。net,
  北京,
  18,
  }
  fmt。Printf(p8v,p8)p8main。person{name:1cxy。net,city:北京,age:18}
  使用这种格式初始化时,需要注意:
  1。必须初始化结构体的所有字段。
  2。初始值的填充顺序必须与字段在结构体中的声明顺序一致。
  3。该方式不能和键值初始化方式混用。
  1。3。6。结构体内存布局
  typeteststruct{
  aint8
  bint8
  cint8
  dint8
  }
  n:test{
  1,2,3,4,
  }
  fmt。Printf(n。ap,n。a)
  fmt。Printf(n。bp,n。b)
  fmt。Printf(n。cp,n。c)
  fmt。Printf(n。dp,n。d)
  输出:
  n。a0xc0000a0060
  n。b0xc0000a0061
  n。c0xc0000a0062
  n。d0xc0000a0063
  1。3。7。面试题
  typestudentstruct{
  namestring
  ageint
  }
  funcmain(){
  m:make(map〔string〕student)
  stus:〔〕student{
  {name:1cxy。net,age:18},
  {name:测试,age:23},
  {name:博客,age:28},
  }
  for,stu:rangestus{
  m〔stu。name〕stu
  }
  fork,v:rangem{
  fmt。Println(k,,v。name)
  }
  }
  1。3。8。构造函数
  Go语言的结构体没有构造函数,我们可以自己实现。例如,下方的代码就实现了一个person的构造函数。因为struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。
  funcnewPerson(name,citystring,ageint8)person{
  returnperson{
  name:name,
  city:city,
  age:age,
  }
  }
  调用构造函数
  p9:newPerson(1cxy。net,测试,90)
  fmt。Printf(v,p9)
  1。3。9。方法和接收者
  Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者self。
  方法的定义格式如下:
  func(接收者变量接收者类型)方法名(参数列表)(返回参数){
  函数体
  }
  其中,
  1。接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名的第一个小写字母,而不是self、this之类的命名。例如,Person类型的接收者变量应该命名为p,Connector类型的接收者变量应该命名为c等。
  2。接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
  3。方法名、参数列表、返回参数:具体格式与函数定义相同。
  举个例子:
  Person结构体
  typePersonstruct{
  namestring
  ageint8
  }
  NewPerson构造函数
  funcNewPerson(namestring,ageint8)Person{
  returnPerson{
  name:name,
  age:age,
  }
  }
  DreamPerson做梦的方法
  func(pPerson)Dream(){
  fmt。Printf(s的梦想是学好Go语言!,p。name)
  }
  funcmain(){
  p1:NewPerson(测试,25)
  p1。Dream()
  }
  方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。
  1。3。10。指针类型的接收者
  指针类型的接收者由一个结构体的指针组成,由于指针的特性,调用方法时修改接收者指针的任意成员变量,在方法结束后,修改都是有效的。这种方式就十分接近于其他语言中面向对象中的this或者self。例如我们为Person添加一个SetAge方法,来修改实例变量的年龄。
  SetAge设置p的年龄
  使用指针接收者
  func(pPerson)SetAge(newAgeint8){
  p。agenewAge
  }
  调用该方法:
  funcmain(){
  p1:NewPerson(测试,25)
  fmt。Println(p1。age)25
  p1。SetAge(30)
  fmt。Println(p1。age)30
  }
  1。3。11。值类型的接收者
  当方法作用于值类型接收者时,Go语言会在代码运行时将接收者的值复制一份。在值类型接收者的方法中可以获取接收者的成员值,但修改操作只是针对副本,无法修改接收者变量本身。
  SetAge2设置p的年龄
  使用值接收者
  func(pPerson)SetAge2(newAgeint8){
  p。agenewAge
  }
  funcmain(){
  p1:NewPerson(测试,25)
  p1。Dream()
  fmt。Println(p1。age)25
  p1。SetAge2(30)(p1)。SetAge2(30)
  fmt。Println(p1。age)25
  }
  1。3。12。什么时候应该使用指针类型接收者
  1。需要修改接收者中的值
  2。接收者是拷贝代价比较大的大对象
  3。保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。
  1。3。13。任意类型添加方法
  在Go语言中,接收者的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法。举个例子,我们基于内置的int类型使用type关键字可以定义新的自定义类型,然后为我们的自定义类型添加方法。
  MyInt将int定义为自定义MyInt类型
  typeMyIntint
  SayHello为MyInt添加一个SayHello的方法
  func(mMyInt)SayHello(){
  fmt。Println(Hello,我是一个int。)
  }
  funcmain(){
  varm1MyInt
  m1。SayHello()Hello,我是一个int。
  m1100
  fmt。Printf(vT,m1,m1)100main。MyInt
  }
  注意事项:非本地类型不能定义方法,也就是说我们不能给别的包的类型定义方法。
  1。3。14。结构体的匿名字段
  结构体允许其成员字段在声明时没有字段名而只有类型,这种没有名字的字段就称为匿名字段。
  Person结构体Person类型
  typePersonstruct{
  string
  int
  }
  funcmain(){
  p1:Person{
  1cxy。net,
  18,
  }
  fmt。Printf(v,p1)main。Person{string:1cxy。net,int:18}
  fmt。Println(p1。string,p1。int)1cxy。net18
  }
  匿名字段默认采用类型名作为字段名,结构体要求字段名称必须唯一,因此一个结构体中同种类型的匿名字段只能有一个。
  1。3。15。嵌套结构体
  一个结构体中可以嵌套包含另一个结构体或结构体指针。
  Address地址结构体
  typeAddressstruct{
  Provincestring
  Citystring
  }
  User用户结构体
  typeUserstruct{
  Namestring
  Genderstring
  AddressAddress
  }
  funcmain(){
  user1:User{
  Name:pprof,
  Gender:女,
  Address:Address{
  Province:黑龙江,
  City:哈尔滨,
  },
  }
  fmt。Printf(user1v,user1)user1main。User{Name:pprof,Gender:女,Address:main。Address{Province:黑龙江,City:哈尔滨}}
  }
  1。3。16。嵌套匿名结构体
  Address地址结构体
  typeAddressstruct{
  Provincestring
  Citystring
  }
  User用户结构体
  typeUserstruct{
  Namestring
  Genderstring
  Address匿名结构体
  }
  funcmain(){
  varuser2User
  user2。Namepprof
  user2。Gender女
  user2。Address。Province黑龙江通过匿名结构体。字段名访问
  user2。City哈尔滨直接访问匿名结构体的字段名
  fmt。Printf(user2v,user2)user2main。User{Name:pprof,Gender:女,Address:main。Address{Province:黑龙江,City:哈尔滨}}
  }
  当访问结构体成员时会先在结构体中查找该字段,找不到再去匿名结构体中查找。
  1。3。17。嵌套结构体的字段名冲突
  嵌套结构体内部可能存在相同的字段名。这个时候为了避免歧义需要指定具体的内嵌结构体的字段。
  Address地址结构体
  typeAddressstruct{
  Provincestring
  Citystring
  CreateTimestring
  }
  Email邮箱结构体
  typeEmailstruct{
  Accountstring
  CreateTimestring
  }
  User用户结构体
  typeUserstruct{
  Namestring
  Genderstring
  Address
  Email
  }
  funcmain(){
  varuser3User
  user3。Namepprof
  user3。Gender女
  user3。CreateTime2019ambiguousselectoruser3。CreateTime
  user3。Address。CreateTime2000指定Address结构体中的CreateTime
  user3。Email。CreateTime2000指定Email结构体中的CreateTime
  }
  1。3。18。结构体的继承
  Go语言中使用结构体也可以实现其他编程语言中面向对象的继承。
  Animal动物
  typeAnimalstruct{
  namestring
  }
  func(aAnimal)move(){
  fmt。Printf(s会动!,a。name)
  }
  Dog狗
  typeDogstruct{
  Feetint8
  Animal通过嵌套匿名结构体实现继承
  }
  func(dDog)wang(){
  fmt。Printf(s会汪汪汪,d。name)
  }
  funcmain(){
  d1:Dog{
  Feet:4,
  Animal:Animal{注意嵌套的是结构体指针
  name:乐乐,
  },
  }
  d1。wang()乐乐会汪汪汪
  d1。move()乐乐会动!
  }
  1。3。19。结构体字段的可见性
  结构体中字段大写开头表示可公开访问,小写表示私有(仅在定义当前结构体的包中可访问)。
  1。3。20。结构体与JSON序列化
  JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON键值对是用来保存JS对象的一种方式,键值对组合中的键名写在前面并用双引号包裹,使用冒号:分隔,然后紧接着值;多个键值之间使用英文,分隔。
  Student学生
  typeStudentstruct{
  IDint
  Genderstring
  Namestring
  }
  Class班级
  typeClassstruct{
  Titlestring
  Students〔〕Student
  }
  funcmain(){
  c:Class{
  Title:101,
  Students:make(〔〕Student,0,200),
  }
  fori:0;i10;i{
  stu:Student{
  Name:fmt。Sprintf(stu02d,i),
  Gender:男,
  ID:i,
  }
  c。Studentsappend(c。Students,stu)
  }
  JSON序列化:结构体JSON格式的字符串
  data,err:json。Marshal(c)
  iferr!nil{
  fmt。Println(jsonmarshalfailed)
  return
  }
  fmt。Printf(json:s,data)
  JSON反序列化:JSON格式的字符串结构体
  str:{Title:101,Students:〔{ID:0,Gender:男,Name:stu00},{ID:1,Gender:男,Name:stu01},{ID:2,Gender:男,Name:stu02},{ID:3,Gender:男,Name:stu03},{ID:4,Gender:男,Name:stu04},{ID:5,Gender:男,Name:stu05},{ID:6,Gender:男,Name:stu06},{ID:7,Gender:男,Name:stu07},{ID:8,Gender:男,Name:stu08},{ID:9,Gender:男,Name:stu09}〕}
  c1:Class{}
  errjson。Unmarshal(〔〕byte(str),c1)
  iferr!nil{
  fmt。Println(jsonunmarshalfailed!)
  return
  }
  fmt。Printf(v,c1)
  }
  1。3。21。结构体标签(Tag)
  Tag是结构体的元信息,可以在运行的时候通过反射的机制读取出来。
  Tag在结构体字段的后方定义,由一对反引号包裹起来,具体的格式如下:
  key1:value1key2:value2
  结构体标签由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。键值对之间使用一个空格分隔。注意事项:为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。例如不要在key和value之间添加空格。
  例如我们为Student结构体的每个字段定义json序列化时使用的Tag:
  Student学生
  typeStudentstruct{
  IDintjson:id通过指定tag实现json序列化该字段时的key
  Genderstringjson序列化是默认使用字段名作为key
  namestring私有不能被json包访问
  }
  funcmain(){
  s1:Student{
  ID:1,
  Gender:女,
  name:pprof,
  }
  data,err:json。Marshal(s1)
  iferr!nil{
  fmt。Println(jsonmarshalfailed!)
  return
  }
  fmt。Printf(jsonstr:s,data)jsonstr:{id:1,Gender:女}
  }
  1。3。22。小练习:
  猜一下下列代码运行的结果是什么
  packagemain
  importfmt
  typestudentstruct{
  idint
  namestring
  ageint
  }
  funcdemo(ce〔〕student){
  切片是引用传递,是可以改变值的
  ce〔1〕。age999
  ceappend(ce,student{3,xiaowang,56})
  returnce
  }
  funcmain(){
  varce〔〕student定义一个切片类型的结构体
  ce〔〕student{
  student{1,xiaoming,22},
  student{2,xiaozhang,33},
  }
  fmt。Println(ce)
  demo(ce)
  fmt。Println(ce)
  }
  1。3。23。删除map类型的结构体
  packagemain
  importfmt
  typestudentstruct{
  idint
  namestring
  ageint
  }
  funcmain(){
  ce:make(map〔int〕student)
  ce〔1〕student{1,xiaolizi,22}
  ce〔2〕student{2,wang,23}
  fmt。Println(ce)
  delete(ce,2)
  fmt。Println(ce)
  }
  1。3。24。实现map有序输出(面试经常问到)
  packagemain
  import(
  fmt
  sort
  )
  funcmain(){
  map1:make(map〔int〕string,5)
  map1〔1〕www。尹成微信18510341407
  map1〔2〕rpc。尹成微信18510341407
  map1〔5〕ceshi
  map1〔3〕xiaohong
  map1〔4〕xiaohuang
  sli:〔〕int{}
  fork,:rangemap1{
  sliappend(sli,k)
  }
  sort。Ints(sli)
  fori:0;ilen(map1);i{
  fmt。Println(map1〔sli〔i〕〕)
  }
  }

特斯拉中国的超级二工厂将花落何城?面对全球以及中国市场新能源销售热潮,新能源汽车的标杆特斯拉不仅仅有美国的超级工厂,还有德国的超级工厂,和中国的上海超级工厂,但是随着设计产能的饱和,扩建新工厂满足未来的销售需求……苹果为什么把数据中心建设在贵州?此前苹果曾宣称从2月28日开始,中国大陆地区的iCloud服务将遵从中国法律的规定,由国内企业云上贵州负责运营。将服务器转至国内公司运营后,iCloud的访问速度会大幅提升,提……财报搜狐2021年全年盈利7900万美元,同比增长54。92022年2月22日,搜狐公司公布2021年四季度及2021年度财务报告,第四季度总收入为1。93亿美元,全年总收入为8。36亿美元。搜狐创始人、董事局主席兼首席执行官张……快手为什么这么红?因为抖音的金币越来越少了,转一圈才一两个金币,而快手转一圈至少是几十个金币,所以都到快手去了,看的人多了,自然就红了我也是最近转移到快手极速版了,头条极速版每天从早到晚累……iPhone防水性能误导消费者?法官已经驳回此案近日,美国一名联邦法官驳回了一项拟议中的集体诉讼,该诉讼指控苹果在iPhone防水性能方面误导消费者。自iPhone7发布以来,苹果在其营销活动中广泛宣传iPhone7的……证券之星APP亚马逊(AMZN。US)网络服务(AWS):百思买(BBY。US)已承诺为其技术团队招聘1,000名新员工。亚马逊(AMZN。US)公司简介:亚马逊公司从事提供在线零售购……3nm芯片鸿蒙系统都来了,华为双喜临门3nm麒麟芯片曝光从去年下半年开始,华为的芯片事业就一直备受人们关注,因为美国规则导致其失去了最主要的供应商台积电,海思已设计好的芯片无法得到代工,陷入了供应不足的处境。……原来华为手机长按2秒,还能开启5个隐藏功能,几千块果真没白花华为手机虽然价格算是比较高的,但胜在好用的功能很多。这里就来分享华为手机长按2秒,可以开启的5个隐藏功能,学会你会觉得几千块果真没有白花,一起来看看吧。1、应用快捷……中国人不骗中国人,小屏旗舰魅族1818s和小米12你喜欢哪一小米12。魅族18、魅族18s和小米12参数对比如下图:虽然,魅族拥有2K屏幕更好的显示效果,低600元的价格,更轻的机身,更快的超声波屏下指纹,更好的长焦和广角。……小区没有充电桩,电动车上楼充电,物业不管怎么办?报警!打119!报警!物业不管,报告给更大的物业啊!会有人管。一个110解决。2015年以前很少有人会关心电动车是否上楼充电,因为那个时候的电动车绝大多数都是……ASO和ASM的关系与区别很多刚入行的从业者,都被ASO、ASM这两个行业专属词搞混了,特别是ASM,接下来就由冠智ASO带你了解一下这两者的区别。一、ASOASM的定义ASO(AppSto……荣耀推出首个高端折叠屏手机,京东方沃特股份亮明合作关系21世纪经济报道记者雷晨北京报道1月11日晚间,距荣耀发布折叠屏手机仅一天时间,就有超过3万人在京东平台上预约抢购。此前1月10日晚,荣耀发布了其首款高端折叠屏手机……
小米新旗舰曝光,骁龙888真全面屏144Hz,香气四溢随着消费者的消费观念越来越理性,在现在这样日趋同异化的手机市场里,越来越多的手机厂商更加注重产品设计和产品创新,因为只有创造出更加有个性有代表性的产品,才能让更多的人关注。因此……6。95秒破百,9。88万起售,搭1。5T动力的影豹值得考虑在国内的汽车市场,年轻化与运动化的车型无疑是最受欢迎的。其中谈到运动型轿车,本田思域和领克03是在这方面做得比较出彩的车型,它们的销量也是被各个竞争对手所羡慕。为了吸引年轻人的……发泡机ce认证办理发泡机,又名泡沫发生器,是一种将发泡剂达到一定浓度的水溶液制成泡沫设备。发泡剂本身是不能自动成为泡沫,必须通过发泡机的机械作用才能成为泡沫。发泡机CE认证需要准备的技术资……字节跳动(抖音)Android客户端实习31面经很多朋友知道我在字节担任面试官,做公号的初衷之一也是希望能多一个为团队网络人才的渠道。但是一段时间下来发现真正找我咨询、内推的人并不多,不少同学对字节的面试有所忌惮,总担心准备……学完网络安全可以做哪些工作呢,沈阳有网络安全培训吗?第一个阶段:主要讲的是网络安全概述,了解计算机运行原理、初步开始了解网络安全行业、网络安全法普及解读,接下来就是Linux系统和windows系统的一些知识,最后就是虚拟机搭建……为什么轻薄本都不完美?轻薄笔记本因为轻薄,所以散热效果不好。轻薄意味着在相同技术下的简配,比如取消USB端口,及其他内置配件,比如散热风扇。技术更新前提就是价格上涨。但最主要还是看你使用电脑用……你手机里面有多少明明基本不用,但是依旧没有删掉的应用?APP虽然很多,但不经常用的也好多,比如每个银行的APP,不是用的很多,但是也不能删了是吧。还有一些音乐APP,我有4个,酷狗音乐APP网易云音乐QQ音乐虾米音乐全民k歌。经常……荣耀50SE开售售价2399元起,搭载1亿像素66W快充前段时间荣耀发布了旗下数字系列的全新产品荣耀50系列,凭借其出色的表现,受到了广泛的关注。在荣耀50与荣耀50Pro相继开售之后,荣耀50系列的最后一款产品荣耀50SE也于近日……最受欢迎的华为Mate系列产品,发布一年依然保持高端华为是目前中国最受欢迎的手机品牌。每一款手机都经过精心的提炼,华为手机已经成为全球市场占有率最高的手机品牌。国内用户也特别喜欢华为手机。华为Mate30是华为目前Mate……2020年中国K12阶段学生分级阅读白皮书核心摘要:阅读越来越重要,分级阅读是大势所趋99父母会采取措施提高孩子阅读水平,但是95父母在孩子阅读方面仍有各种困扰,而分级阅读可以有效解决令父母困扰的选书难和阅……郭全中媒体融合向纵深发展的关键技术及实现2020年6月30日,中央全面深化改革委员会第十四次会议审议通过的《关于加快推进媒体深度融合发展的指导意见》指出,推动媒体融合向纵深发展,要深化体制机制改革,加大全媒体人才培养……原创理想如星辰作者李明昊网络文学文学交流专注原创原创作品授权天美五星全网首发文章阅读也可在微信读书讯飞有声上检索此文理想如星辰作者李明昊编审天美五星理想如星辰……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网