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

go类型系统

  类型系统
  数据类型是一门语言最基础的内容。对于静态语言来说,会设计多种不同的数据类型。设计不同数据类型的目的主要是为了在编译阶段根据类型确定分配不同大小的内存。
  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;longba;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里

冬奥会都有哪些项目呢!开幕式已经进入倒计时冬季奥林匹克运动会简称为冬季奥运会、冬奥会。主要由全世界地区举行,是世界规模最大的冬季综合性运动会,每四年举办一届,1994年起与夏季奥林匹克运动会相间举行。参与国主要分布在世……文案王者荣耀那些印象深刻的角色语录大赏1:【李白】我还是喜欢你,就像皓月天边,半步青莲,愿你把酒持剑,归来仍是少年。‘我曾十步杀一人,却败你一个眼神。2:【扁鹊】我还是喜欢你,就像药衣白骨,青石寒墓,愿你眉目……恭喜杨鸣!恭喜辽宁男篮!CBA顶级后卫表决心,有望加盟辽篮恭喜杨鸣!恭喜辽宁男篮!CBA顶级后卫表决心,有望加盟辽篮北京时间2022年1月13日,CBA常规赛继续进行,而今天的比赛可以说是大饱眼福,虽然山东男篮和上海男篮的二番战……GTAOL合约专家DLC更新后,那些十分重要的关键细节你知道在2021年12月15日,R星新的DLC《合约专家》更新以来,不知道小伙伴们有么有发现本次更新有很多到位的细节!接下里我们就一探究竟!首先我们能看到小富家的门牌已经变了……夜读丨新的一年愿所有美好,与你环环相扣文字丨茶诗花主播丨竹子时光悠悠,岁月溜走。季节的风霜早已尘封了往昔的安暖。不知不觉,已是岁暮寒冬。回首这一年的时光,有遭遇挫折的忧愁,也有达成目标的喜悦。经历……精准护肤时代来临!如何把握精度,打通产品任督二脉更鲜活、更高效、更科学?定义精准的化妆品赛道,拥有巨大的增长潜力。化妆品行业有些显而易见的变化在发生,例如精准护肤出现频率颇高。这也是伴随时代的进步,消费者生活水平……虚幻引擎5何时发布中小团队能用吗?一切都在UnrealOpe12月2日,UnrealOpenDay2021虚幻引擎技术开放日(以下简称UOD)在上海阿纳迪酒店正式开幕。这也是时隔两年后,UOD克服诸多现实因素首次回归线下。会上,E……冷冻人1000年后复活?专家解密冷冻人复活后的迷题如果你在1000年后复活,你会怎么样?假设在科学上,如果冷冻人等待复活成功,复活者的实际挑战是什么?时间问题这是一个与等待数百年甚至数千年的时间的相关情况。想……魅族旗舰遇清仓价,三星定制SuperAMOLED显示屏骁龙8魅族品牌相较其他国内手机品牌,有着个性鲜明的独家特色,此前曾被广大网友亲切地称之为行业清流厂商。不过由于此前战略失误,手机销量可谓惨淡,如今昔日旗舰机型魅族17也在电商平台挂出……68岁的赵雅芝状态太好了,穿黑白拼色礼裙显高贵,造型得体又大随着时间的流逝,青春年华便一去不复返了。岁月在大家身上所留下的痕迹,同样也会在个人的形象气质上赋予不同。尽管年龄没有了优势,身材也面临着走样的风险,但是个人的形象气质却是任何人……南科大刘奇航课题组与合作团队在磁性材料的对称性研究中取得进展近日,南方科技大学物理系、量子科学与工程研究院副教授刘奇航课题组与合作团队,在非相对论极限下的磁性材料对称性研究中取得进展,相关成果以Spingroupsymmetryinma……失眠难入睡如何调整?安眠药如何选择?缓解失眠问题这样做在生活的重压下,焦虑、失眠仿佛成了常态。尤其是失眠,现代很多人都有睡眠障碍,睡觉8小时,失眠5小时,甚至一失眠就是一整晚,明明身体很疲惫,但就是睡不着,这种症状总是让患者痛苦不……
建议车主如果条件允许,车上尽量备上这4样,自驾游舒适又安全建议车主:如果条件允许,车上尽量备上这4样,自驾游舒适又安全随着经济的快速发展,人们的生活水平提高,越来越多家庭有了自己的专属小车,大大方便了日常的出行。但是开车上路,我……华为手表也要捅破天?曝Watch4将支持卫星通讯技术【CNMO新闻】2022年的9月份,华为正式发布了它们旗下的旗舰机型Mate50系列。作为华为最顶尖的手机产品之一,Mate50系列无疑是成功且优秀的。除了各种配置提升之外,这……JWST最新观测报告,恒星诞生的早期阶段ASTELCO为科研而设计的专业望远镜Credits:SCIENCE:NASA,ESA,CSA,JaniceLee(NOIRLab)IMAGEPROCESSI……火箭8换1招募小卡,斯通再出优质报价,哈登小卡联手冲击总冠军头条创作挑战赛快船终于赢了,威少松了一口气,握紧的拳头松开了。谁都没有预料到,在引进威少后快船直接一波五连败,即便是战胜了残阵灰熊队,但是在比赛中快船曾经落后二十多分,最……(图表漫画)新华视点科技改变生活新华社图表,北京,2023年2月14日(漫画)科技改变生活近日,AIGC即人工智能生成内容,再一次引发公众关注:一款名为ChatGPT的聊天机器人程序在社交媒体上不……过年哪里耍?会泽大海草山赏雪滑雪约起来乌蒙山巅,大雪皑皑,羊群撒欢,滑雪爱好者们在雪场尽情驰骋,享受高原冰雪运动带来的乐趣。春节期间,喜欢玩雪的朋友不用去雪乡,会泽大海草山滑雪场就可满足赏雪滑雪的愿望。快过年……多彩石家庄非遗过大年丨年味儿里的石家庄传统美食过大年1月14日,由石家庄市文化广电和旅游局主办,河北新闻网承办,各县(市、区)文化和旅游部门协办的玉兔迎春多彩石家庄非遗过大年系列活动正式开启!活动将陆续推出年味儿里的石家庄非遗展……全球唯一!医疗科技巨头为何看好中国跨国企业在中国目前,中国是美敦力全球范围内唯一拥有两座创新中心的单一市场。2月20日,在新时代新机遇跨国企业在中国网上主题宣传报道走访中,美敦力全球高级副总裁及大中华区总裁顾宇韶表示,……联盟倒数第三,哈登无能为力!东部第一中锋,终究是浪得虚名东部的两大强队雄鹿12连胜一骑绝尘,紧随其后的就是费城76人,最近同样拿到了4连胜,新援麦克丹尼尔斯的到来,确实给球队增添了不少活力。不过,这个赛季的费城76人,依旧不是……关于情感长文案最流行的情感文案句子1。我失去了这段感情我爱了这么久,我几乎以为你是我的现在我很高兴我不后悔遇见你,我只是很抱歉我只能在这里陪你如果离开让你开心,那我就微笑成全你我曾经以为,当我真心对待一个人时,……产前科普水中分娩可以减轻一部分生产痛水中分娩什么是水中分娩,顾名思义,就是在水里生孩子。水中分娩是一种新型的分娩方式,整个分娩过程在水中进行,能缓解分娩阵痛。在分娩过程中,新生儿的头部必须完全浸没在水……游戏王附属卡暗黑魔族基尔法恶魔周刊少年跳跃(2001年11号)附属卡登场的暗属性恶魔族的上级怪物。:这张卡被送入墓地时,可以以场上的1只表侧表示怪兽为对象发动。将墓地的这张卡当作使攻击力下降500的装……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网