范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

go类型系统

  类型系统
  数据类型是一门语言最基础的内容。对于静态语言来说,会设计多种不同的数据类型。设计不同数据类型的目的主要是为了在编译阶段根据类型确定分配不同大小的内存。
  go和java一样,同属于静态语言阵营。不同于动态语言(python、ruby,javascript等)可以在运行时通过对变量赋值的分析,自动确定内存边界,并且动态语言的变量可以在运行时赋予不同的数据类型。静态语言必须通过变量声明,显式的告诉编译器变量的类型信息。
  看起来稍显麻烦,但是go提供了自动分析变量类型的能力。下面你会看到。 java
  java中通常将数据类型分为两类:基本数据类型(Primitive Type)和引用数据类型(Reference Type) 基本数据类型
  分为8种
  类型名称
  关键字
  占用内存
  取值范围
  字节型
  byte
  1 字节
  -128~127
  短整型
  short
  2 字节
  -32768~32767
  整型
  int
  4 字节
  -2147483648~2147483647
  长整型
  long
  8 字节
  -9223372036854775808L~9223372036854775807L
  单精度浮点型
  float
  4 字节
  +/-3.4E+38F(6~7 个有效位)
  双精度浮点型
  double
  8 字节
  +/-1.8E+308 (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中有两种内置类型别名(type alias): 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编码方案用utf-8编码存储的情况下,一个汉字是三个字节。  func TestChinese(t *testing.T) {      var s string = "中国"      t.Log("中国的字节长度是", len(s))  // 6      t.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" // 一个英文字符  "π"  "众" // 一个中文字符 func Test_rune(t *testing.T) {      var a rune = "a"      t.Log(a)      t.Log(a == 97) // true  }
  打印的结果是97。"a"的unicode编码就是97。两者是等价的。
  go中的字符使用unicode编码方案编码的,但是在存储上使用utf-8的方案。  func TestRune(t *testing.T) {      var c rune = "中"      t.Logf("中的unicode码点%x", c) // 4e2d        buf := make([]byte, 3)      utf8.EncodeRune(buf, c)      t.Logf("中的unicode码点的utf-8存储0x%x", buf) // 0xe4b8ad      // 一个汉字三个字节        // 对utf-8解码      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中      @Test      public void easy() {          int a = 100;          long b = a;          int c = (int)b;      }
  范围小的int型可以直接默认转为long型。但是long型转为int必须显式类型转换。
  但是在go中  func Test_Type_Change(t *testing.T) {      var a int8 = 100      var b int64 = int64(a)      var c int16 = int16(b)  }
  所有的类型转换,都必须显式进行。个人感觉,go这样处理还是好的,程序员应该知道自己在干什么。java的隐式转换其实除了省的敲两下代码,没什么用。反而容易出故障。      @Test      public void easy() {          float a = 1.3f;          int b = (int) a;          int c = (int) 1.3f;      } func Test_Type_Change(t *testing.T) {      var a = float32(1.2) // 合法      var b = int(a)       // 合法      var c = int(1.2)     // 非法,这样写不允许  }
  在go和java中,进行精度的转换都是可以的,但是go中直接进行字面量的类型转换是不允许的,这样做也是没有必须要的。所以不允许是更合理的。 常量
  go中声明常量用const,java是final。  const a int8 = 16  const b = "bbb"  const (      C, D = int16(100), int64(88)  )
  很简单。看一下就行,go中这些写法都合法。
  但是go中还有一些特殊的写法。 常量声明的自动补全
  在声明多个常量时,可以使用省略写法。省略的声明,go编译器在编译代码时会自动寻找前面最近的完整描述进行重写。比如  const (      X float32 = 3.1416      Y                // 这里必须只有一个标识符      Z                // 这里必须只有一个标识符        A, B = "Go", "Java"      C, _             // 空标识符是必需有,数量必须对上  )
  go编译会自动补全为  const (      X float32 = 3.1416      Y float32 = 3.1416      Z float32 = 3.1416        A, B = "Go", "Java"      C, _ = "Go", "Java"  )
  下划线_ 是go中一个空的占位符。作用是承接多返回值中的一个,但是以后不会使用,只是为了对应上。 iota
  这是一个go新手初次看容易懵逼的写法。  const (      Failed = iota - 1 // == -1  iota = 0      Unknown           // == 0   iota = 1      Succeeded         // == 1   iota = 2  )    const (      Readable = 1 << iota // == 1 iota = 0      Writable             // == 2 iota = 1      Executable           // == 4 iota = 2  )
  iota是go内置的一个常量,每次const声明时初始值是0。然后使用自动补全语法时,每一次声明,iota加1。      const a = iota  // iota = 0      const b = iota  // iota = 0
  所以利用iota和自动补全,可以方便的进行多个常量的初始化。
  比如go内置的log包,预定义log打印格式时,就使用iota进行。  const (      Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23      Ltime                         // the time in the local time zone: 01:23:23      Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.      Llongfile                     // full file name and line number: /a/b/c/d.go:23      Lshortfile                    // final file name element and line number: d.go:23.       LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone      Lmsgprefix                    // move the "prefix" from the beginning of the line to before       LstdFlags     = Ldate | Ltime // initial values for the standard logger  )
  相当于  const (      Ldate         = 1      Ltime         = 2                    Lmicroseconds = 4                    Llongfile     = 8                   Lshortfile    = 16                  LUTC          = 32                     Lmsgprefix    = 64                    LstdFlags     = 3  )
  使用时,如果我希望打印的日志前面加上,日期 时间 文件名。那么就传1 + 2 + 8 = 11  log.SetFlags(11)
  打印出的日志类似这样  2021/12/02 15:08:17 d:/github/go_learn/src/concurrent/goroutine/main/main.go:11: hello!  2021/12/02 15:08:17 d:/github/go_learn/src/concurrent/goroutine/main/main.go:11: hi!  2021/12/02 15:08:19 d:/github/go_learn/src/concurrent/goroutine/main/main.go:11: hi!变量声明
  go在变量声明的语法上比java灵活很多。
  首先,一个最标准的变量声明如下  var a int = 10
  一个明显的区别:go把变量名放在了变量类型的前面。
  为什么?Go"s Declaration Syntax - Go 语言博客 (go-zh.org)
  官方有个解释,大体是说,和C相比,在一些复杂函数,参数时指针的情况下,将类型放在后面读起来更容易理解。 自动类型推断
  go可以省略类型信息进行变量声明  var b = 10
  根据前面说的类型推断规则,b会被推断为int型。
  除了之前说的类型推断之外,还支持一次声明多个变量  var a, b = "Go", false  //可以一次声明多个不同类型的变量
  但是  var a string, b bool = "Go", false  //语法错误。确定类型的声明,一次多个变量只能是一种类型
  还可以使用()一次声明多个      var (          a string = "GO"          b bool = false      )短声明语法
  然后,重要的来了。go的短声明语法。  a, b := "Go", false
  省略了var。
  和var声明的一个重要区别是:短声明语法只能用在方法内。 变量的作用域
  go和java一样(以及其他一切高级语言),变量都有不同的作用域。
  java可以通过private,public等关键字设置变量的作用域。
  go没有这些关键字,通过另外一种规范确定作用域。一般而言,可以把go中变量按作用域分成两类:包级变量和局部变量。
  可以感觉到go的变量声明很灵活。但是有点重复了。这与go崇尚的简单原则有些冲突。go的作者之一rob pike也曾表示过如果重新来设计一次变量声明语法,大概率会砍掉一些灵活性,保持统一性。 变量遮蔽
  go和java一样。没什么好说的。基本上语言都是这样。同名变量,局部变量遮蔽包级变量。等等。
  变量遮蔽是我们写代码经常犯的错误,但是很低级。 类型别名
  在上面的基本类型中,提到了 byte  是 uint8  的内置别名, rune  是 int32  的内置别名。
  类型别名这个说法在java中是不存在的。
  go的这个类型别名究竟是怎么回事?
  go源码中是这样定义byte和rune的  // byte is an alias for uint8 and is equivalent to uint8 in all ways. It is  // used, by convention, to distinguish byte values from 8-bit unsigned  // integer values.  type byte = uint8    // rune is an alias for int32 and is equivalent to int32 in all ways. It is  // used, by convention, to distinguish character values from integer values.  type rune = int32
  byte和unit8,rune和int32是完全一样的。
  类型别名和类型定义语法上的区别就是多了个=      var a rune       var b int32 = 132      a = b //可以直接赋值      var c int = 132      // t.Log(a == c)  类型不匹配,不可以直接比较类型定义
  这里要注意类型别名和类型定义的语法。关键字type用来定义类型  type Age int  type (      Name string      Sex int8  )
  这是类型定义的语法。定义一种新的类型,没有= 类型定义的新类型和原类型是两种不同的类型。虽然他们的底层类型都是int 两个底层类型相同的新类型,相互之间转换需要显式执行。而类型别名的数据可直接转换。 类型定义可以写在func里,作用域也只在这个func里

外卖小哥的福音,以后送餐的时候再也不用频繁看手机了对于外卖小哥来说,存在安全隐患的因素一方面是因为订单时间着急,骑行的时候容易横穿或者抄近道的行为,这样的安全隐患非常大。这些年外卖小哥出现的交通事故也挺多的!不过在这个过程还有一种你不知道的手机冷知识(2)1手机比马桶脏多了,细菌比马桶多18倍。2日本的手机几乎都支持防水功能,因为大部分日本人洗澡经常也把手机洗了。3至今没有任何实验数据证明手机辐射对人体有害,朋友圈留言该消停了。49解决多硬盘盘符混乱问题解决多硬盘盘符混乱问题现象在安装了第二块硬盘后,老硬盘与新硬盘上的盘符会出现交叉的现象,在调用文件的时候就会出现很多麻烦,甚至导致某些程序无法使用。方法1。屏蔽硬盘法将两块硬盘设置Windows11来了,我们到底要不要升级?Windows11已经发布有一段时间了,观望中的大家要不要升级呢?如果你的系统是Win8Win7Vista甚至是XP,那么就别折腾了,还是老老实实用现有的系统更好。如果硬用网上的一好香的加湿器,营造更加温和水润的呼吸环境,七彩叮当香薰加湿器现在天气越来越冷,还不时有寒潮来袭,室内暖气空调开久了都会特别干燥,让人嗓子疼鼻子干,皮肤也特别不舒服,这时候确实需要准备一台加湿器来改善一下我们房间里的湿度了。不过在选择加湿器的哪些芯片不容易被国产化1X86处理器2019年,AMDCEO苏姿丰(LisaSu)证实,AMD不再向中国公司(天津海光)授权其新的X86IP产品。另外值得一提的是,国产X86芯片厂商兆芯从威盛获得的X8又一名苹果芯片团队成员离职被微软挖走品玩1月13日讯,据新浪科技引市场消息,微软已经聘请了曾在苹果公司担任芯片设计师的麦克菲利普(MikeFilippo),他将为Azure服务器开发处理器。微软计划进一步改善其云计算华为突然上架5G新机,5000mAh和128GB,首发1649元我国手机领域最近一个月非常的热闹,就连华为都发了一个新的旗舰手机,但可惜只能搭载4G,就算是人气再高,很多消费者而已不愿意去购买。如果华为今年能发布5G手机的话,相信其市场肯定是稳科技行业高级打工人?苹果CEO库克2021年终奖,比去年翻了6倍多?说起苹果手机苹果手表以及苹果平板,相信大家一点都不陌生,苹果在全球有着很多的忠实粉丝,他们时刻关注着苹果的动向。很多的果粉对每次发布的新产品都会购买,也正是这么多忠实粉丝的全力支持适老APP更要重实效2021年1月起,我国在全国范围内开展了为期一年的互联网应用适老化改造行动,金融出行购物等多个领域都推出了适老版APP,取得了阶段性成效。然而,适老APP是否真正走进了老年人生活还2022年值得关注的5个AI趋势thenewstackCOVID19大流行加速了2021年人工智能或机器学习的采用。企业对自动化的需求以及人工智能硬件和软件的进步正在将应用人工智能变为现实。以下是2022年的五种人工智能趋势趋势1大型
蓝牙耳机质检报告办理产品质量检验报告(质检报告),是对产品检测之后出具的一份专业客观的产品质量证明文件,此类报告由第三方质检机构出具,主要应用于电商平台的入驻及新品类产品上架发布。产品质量检验报告能全CE认证有效期是多久要看一个产品的CE认证证书是否过期,主要是看两点1从CE认证法规来看。CE认证的有效期要看产品的对应法规的,CE认证的法规也是随着市场产品的更新在不断的更新着的,每一个新的法规更新法国食品级安全法规DGCCRF法国食品级测试1。DGCCFR(法国食品级)介绍FrenchDGCCRF是法国食品级安全法规的英文简写。销往法国的这类产品,除符合欧盟Regulation(EC)No19352004法规要求外,无线SRRC认证是什么?如何办理?一中国无线电型号核准(SRRC)简述SRRC即国家无线电管理委员会(StateRadioRegulationCommittee,SRRC),SRRC安全认证是由国家无线电管理局核发手持风扇USB风扇日本PSE认证办理流程PSE认证介绍PSE认证是日本强制性安全认证,用以证明电机电子产品已通过日本电气和原料安全法或国际IEC标准的安全标准测试。日本的DENTORL法(电器装置和材料控制法)规定,49羽毛球拍第三方CMACNAS检测报告羽毛球拍一般由拍头拍杆拍柄及拍框与拍杆的接头构成。一支球拍的长度不超过68厘米,其中球拍柄与球拍杆长度不超过42厘米,拍框长度不超过25厘米,宽为20厘米,随着科学技术的发展,球拍限200台!Jeep牧马人高地阿拉斯加极光绿特别版10月29日预售日前,Jeep官方宣布,旗下的牧马人车型将推出高地阿拉斯加极光绿特别版。据悉,新车将于10月29日预售,限量200台。新车依旧采用牧马人经典的外观设计,前格栅亦采用更为立体的设计,饱和式投入千人百亿,哪吒汽车自主研发上再出大动作近日,哪吒汽车联合创始人兼首席执行官张勇在接受媒体采访时表示,哪吒汽车正有序推进自主研发进度,打造智能科技的核心竞争力。同时,在深度自研的基础上,与华为地平线等智能化领军企业展开全运动必备价格实惠南卡RunnerCCII骨传导运动耳机前言南卡这个品牌的耳机我已经使用过很多款了,可以说是运动耳机中的翘楚,不同于其他蓝牙耳机,南卡RunnerCCII主打的是骨传导运动耳机,南卡之前也有类似的产品,比如之前的南卡南卡电动牙刷CE认证证书有效期是多长时间?电动牙刷通过电动机芯的快速旋转或振动,使刷头产生高频振动,瞬间将牙膏分解成细微泡沫,深入清洁牙缝,与此同时,刷毛的颤动能促进口腔的血液循环,对牙龈组织有按摩效果。是许多发达国家广泛霸气!跨越速运重磅承诺限时未达,全额退款随着双十一临近,各大电商平台的GMV以及快递订单量持续暴涨,海量的物流运力资源也提前被各大电商巨头抢占,B端企业运力紧缺的问题愈发严重。众所周知,C端电商企业能收获如此大规模的订单