教育国际新闻办公房产生活
生活城市
词库投稿
生活动态
智能汽车
房产信息
手机数码
办公软件
应用科技
新闻晨报
时事热点
国际环球
商业财经
教育体育
生物科学

go类型系统

8月12日 金钟寨投稿 造句
  类型系统
  数据类型是一门语言最基础的内容。对于静态语言来说,会设计多种不同的数据类型。设计不同数据类型的目的主要是为了在编译阶段根据类型确定分配不同大小的内存。
  go和java一样,同属于静态语言阵营。不同于动态语言(python、ruby,javascript等)可以在运行时通过对变量赋值的分析,自动确定内存边界,并且动态语言的变量可以在运行时赋予不同的数据类型。静态语言必须通过变量声明,显式的告诉编译器变量的类型信息。
  看起来稍显麻烦,但是go提供了自动分析变量类型的能力。下面你会看到。java
  java中通常将数据类型分为两类:基本数据类型(PrimitiveType)和引用数据类型(ReferenceType)基本数据类型
  分为8种
  类型名称
  关键字
  占用内存
  取值范围
  字节型
  byte
  1字节
  128127
  短整型
  short
  2字节
  3276832767
  整型
  int
  4字节
  21474836482147483647
  长整型
  long
  8字节
  9223372036854775808L9223372036854775807L
  单精度浮点型
  float
  4字节
  3。4E38F(67个有效位)
  双精度浮点型
  double
  8字节
  1。8E308(15个有效位)
  字符型
  char
  2字节
  ISO单一字符集
  布尔型
  boolean
  1字节
  true或false引用数据类型
  java中没有指针类型。java的引用数据类型就是数组、类和接口go
  go语言的类型,大体上可以分成三类:基本数据类型,复合数据类型和接口类型。基本类型一种内置布尔类型:bool。11种内置整数类型:int8、uint8、int16、uint16、int32、uint32、int64、uint64、int、uint和uintptr。两种内置浮点数类型:float32和float64。两种内置复数类型:complex64和complex128。一种内置字符串类型:string。
  除了这17种基本类型,Go中有两种内置类型别名(typealias):byte是uint8的内置别名。我们可以将byte和uint8看作是同一个类型。rune是int32的内置别名。我们可以将rune和int32看作是同一个类型。
  可以看到,go对整数类型定义的非常细,这样方便我们选择合适的尺寸,编程出最优化内存占用的程序。平台相关的数据类型
  整数类型中int、uint和uintptr没有写位数,他们的尺寸依赖于具体编译器实现。称为平台相关的数据类型。也就是说,在64位的架构上,int和uint类型的值是64位的;在32位的架构上,它们是32位的。编译器必须保证uintptr类型的值的尺寸能够存下任意一个内存地址。
  所以建议,编写有移植性要求的代码时,最后不要用这种平台相关的数据类型。浮点型
  同样存在精度问题,不可以用于金额相关业务的计算。
  否则坑你没商量。字符串
  和java一样,go的string类型是不可变的。
  go的优化点:对多行字符串的支持。在java里写多行字符串非常恶心,加一堆换行转义符。go只要用反引号引起来。你写什么就是什么。所见即所得。采用unicode编码,对中文支持友好。
  字符串的长度问题
  字符串的长度分字节长度和字符长度。一个汉字是一个字符,在unicode编码方案用utf8编码存储的情况下,一个汉字是三个字节。funcTestChinese(ttesting。T){varsstring中国t。Log(中国的字节长度是,len(s))6t。Log(中国的字符长度是,utf8。RuneCountInString(s))2}字符
  rune这个看起来很陌生,似乎很难理解。但是其实只要类比java的char就好。
  rune,在Go中,一个rune值表示一个Unicode码点。我们可以将一个Unicode码点看作是一个Unicode字符。但是,我们也应该知道,有些Unicode字符由多个Unicode码点组成。不过,每个英文或中文Unicode字符值含有一个Unicode码点。
  可以说,一个rune实例就是一个Unicode字符,一个Go的字符串可以被视为rune实例的集合
  一个rune字面量由若干包在一对单引号中的字符组成。包在单引号中的字符序列表示一个Unicode码点值。rune字面量形式有几个变种,其中最常用的一种变种是将一个rune值对应的Unicode字符直接包在一对单引号中。比如:a一个英文字符众一个中文字符funcTestrune(ttesting。T){vararuneat。Log(a)t。Log(a97)true}
  打印的结果是97。a的unicode编码就是97。两者是等价的。
  go中的字符使用unicode编码方案编码的,但是在存储上使用utf8的方案。funcTestRune(ttesting。T){varcrune中t。Logf(中的unicode码点x,c)4e2dbuf:make(〔〕byte,3)utf8。EncodeRune(buf,c)t。Logf(中的unicode码点的utf8存储0xx,buf)0xe4b8ad一个汉字三个字节对utf8解码r,size:utf8。DecodeRune(buf)t。Logf(s,string(r))t。Log(size)}组合类型指针类型类似C语言指针结构体类型类似C语言的结构体函数类型函数类型在Go中是一种一等公民类别容器类型包括:数组类型确定长度的容器类型切片类型动态容量的容器类型map类型也常称为字典类型。在标准编译器中映射是使用哈希表实现的。通道类型通道用来同步并发的协程接口类型接口在反射和多态中发挥着重要角色类型推断规则
  如前所述,go的基本类型,比如int,有很多不同的尺寸类型。所以一个整数100。并不能确定其究竟是什么类型。这种情况在go中就称为值的类型不确定性。(在java中就不存在这种情况)。因为这种不确定性,就需要类型推断的原则。一个字符串的默认类型是string类型。一个布尔值的默认类型是bool类型。一个整数型的默认类型是int类型。一个rune字符的默认类型是rune(亦即int32)类型。一个浮点数的默认类型是float64类型。一个复数的默认类型是预声明的complex128类型。类型转换问题
  和java一样,go中也可以进行类型转换。这又分两者情况。基本类型和组合类型。基本类型
  在java中Testpublicvoideasy(){inta100;intc(int)b;}
  范围小的int型可以直接默认转为long型。但是long型转为int必须显式类型转换。
  但是在go中funcTestTypeChange(ttesting。T){varaint8100varbint64int64(a)varcint16int16(b)}
  所有的类型转换,都必须显式进行。个人感觉,go这样处理还是好的,程序员应该知道自己在干什么。java的隐式转换其实除了省的敲两下代码,没什么用。反而容易出故障。Testpublicvoideasy(){floata1。3f;intb(int)a;intc(int)1。3f;}funcTestTypeChange(ttesting。T){varafloat32(1。2)合法varbint(a)合法varcint(1。2)非法,这样写不允许}
  在go和java中,进行精度的转换都是可以的,但是go中直接进行字面量的类型转换是不允许的,这样做也是没有必须要的。所以不允许是更合理的。常量
  go中声明常量用const,java是final。constaint816constbbbbconst(C,Dint16(100),int64(88))
  很简单。看一下就行,go中这些写法都合法。
  但是go中还有一些特殊的写法。常量声明的自动补全
  在声明多个常量时,可以使用省略写法。省略的声明,go编译器在编译代码时会自动寻找前面最近的完整描述进行重写。比如const(Xfloat323。1416Y这里必须只有一个标识符Z这里必须只有一个标识符A,BGo,JavaC,空标识符是必需有,数量必须对上)
  go编译会自动补全为const(Xfloat323。1416Yfloat323。1416Zfloat323。1416A,BGo,JavaC,Go,Java)
  下划线是go中一个空的占位符。作用是承接多返回值中的一个,但是以后不会使用,只是为了对应上。iota
  这是一个go新手初次看容易懵逼的写法。const(Failediota11iota0Unknown0iota1Succeeded1iota2)const(Readable1iota1iota0Writable2iota1Executable4iota2)
  iota是go内置的一个常量,每次const声明时初始值是0。然后使用自动补全语法时,每一次声明,iota加1。constaiotaiota0constbiotaiota0
  所以利用iota和自动补全,可以方便的进行多个常量的初始化。
  比如go内置的log包,预定义log打印格式时,就使用iota进行。const(Ldate1iotathedateinthelocaltimezone:20090123Ltimethetimeinthelocaltimezone:01:23:23Lmicrosecondsmicrosecondresolution:01:23:23。123123。assumesLtime。Llongfilefullfilenameandlinenumber:abcd。go:23Lshortfilefinalfilenameelementandlinenumber:d。go:23。LUTCifLdateorLtimeisset,useUTCratherthanthelocaltimezoneLmsgprefixmovetheprefixfromthebeginningofthelinetobeforeLstdFlagsLdateLtimeinitialvaluesforthestandardlogger)
  相当于const(Ldate1Ltime2Lmicroseconds4Llongfile8Lshortfile16LUTC32Lmsgprefix64LstdFlags3)
  使用时,如果我希望打印的日志前面加上,日期时间文件名。那么就传12811log。SetFlags(11)
  打印出的日志类似这样2021120215:08:17d:githubgolearnsrcconcurrentgoroutinemainmain。go:11:hello!2021120215:08:17d:githubgolearnsrcconcurrentgoroutinemainmain。go:11:hi!2021120215:08:19d:githubgolearnsrcconcurrentgoroutinemainmain。go:11:hi!变量声明
  go在变量声明的语法上比java灵活很多。
  首先,一个最标准的变量声明如下varaint10
  一个明显的区别:go把变量名放在了变量类型的前面。
  为什么?GosDeclarationSyntaxGo语言博客(gozh。org)
  官方有个解释,大体是说,和C相比,在一些复杂函数,参数时指针的情况下,将类型放在后面读起来更容易理解。自动类型推断
  go可以省略类型信息进行变量声明varb10
  根据前面说的类型推断规则,b会被推断为int型。
  除了之前说的类型推断之外,还支持一次声明多个变量vara,bGo,false可以一次声明多个不同类型的变量
  但是varastring,bboolGo,false语法错误。确定类型的声明,一次多个变量只能是一种类型
  还可以使用()一次声明多个var(astringGObboolfalse)短声明语法
  然后,重要的来了。go的短声明语法。a,b:Go,false
  省略了var。
  和var声明的一个重要区别是:短声明语法只能用在方法内。变量的作用域
  go和java一样(以及其他一切高级语言),变量都有不同的作用域。
  java可以通过private,public等关键字设置变量的作用域。
  go没有这些关键字,通过另外一种规范确定作用域。一般而言,可以把go中变量按作用域分成两类:包级变量和局部变量。
  可以感觉到go的变量声明很灵活。但是有点重复了。这与go崇尚的简单原则有些冲突。go的作者之一robpike也曾表示过如果重新来设计一次变量声明语法,大概率会砍掉一些灵活性,保持统一性。变量遮蔽
  go和java一样。没什么好说的。基本上语言都是这样。同名变量,局部变量遮蔽包级变量。等等。
  变量遮蔽是我们写代码经常犯的错误,但是很低级。类型别名
  在上面的基本类型中,提到了byte是uint8的内置别名,rune是int32的内置别名。
  类型别名这个说法在java中是不存在的。
  go的这个类型别名究竟是怎么回事?
  go源码中是这样定义byte和rune的byteisanaliasforuint8andisequivalenttouint8inallways。Itisused,byconvention,todistinguishbytevaluesfrom8bitunsignedintegervalues。typebyteuint8runeisanaliasforint32andisequivalenttoint32inallways。Itisused,byconvention,todistinguishcharactervaluesfromintegervalues。typeruneint32
  byte和unit8,rune和int32是完全一样的。
  类型别名和类型定义语法上的区别就是多了个vararunevarbint32132ab可以直接赋值varcint132t。Log(ac)类型不匹配,不可以直接比较类型定义
  这里要注意类型别名和类型定义的语法。关键字type用来定义类型typeAgeinttype(NamestringSexint8)
  这是类型定义的语法。定义一种新的类型,没有类型定义的新类型和原类型是两种不同的类型。虽然他们的底层类型都是int两个底层类型相同的新类型,相互之间转换需要显式执行。而类型别名的数据可直接转换。类型定义可以写在func里,作用域也只在这个func里
评论 转载

造句:类型系统
造句:类型系
冬至养生果蔬开水不能少冬天是蔬菜的淡季,因此,往往一个冬季过后,人体会出现维生素不足,如缺乏维生素C,并因此导致出现口腔溃疡、牙根肿痛、出血、大便秘结等症状。专家建议,人们可适当吃些薯类,如甘……华为手机3个月份额达30。7,超苹果两倍多,三星份额跌至1以经历了2020年和今年的企业竞争风波,华为的手机业务遭受了比较严重的冲击,甚至在全球和国内的手机排名中都不见了踪影,但是令人惊喜的是,华为从没有放弃手机业务的发展,以至于在前三……短池世锦赛张雨霏50蝶第5晋级,彭旭玮覃海洋各自项目进决赛北京时间12月18日,2021年短池游泳世锦赛在阿联酋迪拜进入第三天,上个比赛日夺冠的张雨霏在女子50米蝶泳预赛再次登场,她排名第5进入半决赛。彭旭玮闯入女子200米仰泳决赛,……go类型系统类型系统数据类型是一门语言最基础的内容。对于静态语言来说,会设计多种不同的数据类型。设计不同数据类型的目的主要是为了在编译阶段根据类型确定分配不同大小的内存。go和……冬天,苹果和核桃一起煮,我家一周喝一回,很多人还不懂有什么用冬天,苹果和核桃一起煮,想不到这么厉害,好多人还不知道有啥用。冬天是吃苹果、核桃和大枣的季节,这三样美食营养好吃又解馋,这个季节吃它们正当季。但很多人肯定不会联想到,这三样食材……Rookie正式成为本土选手!今年或许会出成绩,未来值得期待虽然rookie已经在LPL打了很久了,但直到今年才正式官宣成为了本土选手。作为第二批来到LPL的韩援,rookie给这个LPL带来了太多的荣耀,虽然在S11的时候没有打出很不……天玑9000杀疯了!或将成为安卓芯片之王天玑9000上市后,各种评测和跑分接踵而来,作为台积电4nm工艺首发的Soc,把消费者的期待拉开,各项数据表明它全方位压制骁龙8,它还采用了ARMv9公版架构,各方评测显示,天……给女朋友讲某宝是如何设计用户权限管理的(一)一、概述java应用系统设计过程中,用户认证、用户授权、鉴权是绕不过去的话题。如果这个权限管理的设计,没有做到与业务系统的隔离,拓展性不够强,很容易就会拖后腿。……豆腐皮肉卷平常又便宜的食材,简单的烹调方法,也能做出好看又好吃的菜式。今天做一道豆腐皮肉卷,清淡香美,口味随心。用时约半小时。食材肉馅300克,豆腐皮1张(约300毫米……从4199元跌至2299元,256GB5000mAh2K,从容易误触还容易碎屏,这些都是曲面屏的缺点,而且虽然看起来曲面屏拥有了更大的屏占比和可视角度,但实际上这些也都是错觉,认真观察的人会发现,即使是曲面屏手机依然拥有着黑边,所以相比……回顾2022这一年的手机圈,几个关键词被大家一直吐槽的2022年,这下,真的结束了。机哥一刷朋友圈,大家发的内容都很统一。不是在晒网易云QQ音乐年度报告的,就是在晒美团饿了么的年度账单。(看完发现只有我……性教育面对性,我们怎样看待?分享你的摘抄金句面对性,我们怎样看待?不回避,不敷衍,直面孩子的好奇,真诚地和孩子一起聊聊这个话题,就是最好的性教育。家长要自己正确看待性,与其纠结如何回答好孩子的……
传英特尔已取消MeteorLakeP的一部分ChatGPT试管婴儿抱错,主任却劝导要豁达没必要较真,怎么微信公开课许静芳微信搜一搜,连接美好三角镇2023招商11个项目总投资超220亿元pi是否满足信息充分交流原则科普双语什么是卷积神经网络?情绪文案从未拥有过,却又好似失去了千万次他是谁大爆,33岁女三号比女主更惊艳,只因内娱从没正视她!新路2023喜盈门欧海英2023年家居建材消费将迎爆发高质量乐高幻影忍者71783凯的机甲战车EVO开箱评测春色正中分莫负好时光3月24日至26日,崇明部分道路实行交通管制
京东健康上市港股涨超42市值超阿里健康如何用现有图片定制高端详情页?小矮人的一花一世界借东西的小人阿莉埃蒂中医8个按摩方法能瘦手臂肠胃感冒能喝姜汤吗肠胃感冒多是肠胃风寒感冒qq微云在哪里打开(qq邮箱的微云在哪里)安邦智库1月9日战略预测:中国的能源安全应该是综合安全简单的阳产散文捉虾记班主任与教学工作计划爱是什么排比句推荐科普下物理学家麦克斯韦生平
©2025网站地图最近更新文明上网我要投诉