Java程序员:简单类型

Go for Java程序员系列的一部分

在介绍自定义类型和Go的面向对象版本之前,让我们介绍一下开箱即用的简单类型。 可以在(令人惊讶的可读性) 语言规范中找到完整的细节,但是从Java程序员的角度来看,这里有一些重要的重点。

布尔值

布尔变量以bool类型声明,其值必须为两个常量true或false之一。

地鼠头

...
var isActive bool
fmt.Printf("The value of 'isActive' is %t\n", isActive)
...

该程序的输出为:

The value of 'isActive' is false

请注意,如果您不提供任何值,则Go的布尔值(类似于Java的布尔型原语)会初始化为false。 但是,与Java不同,Go没有“原始”布尔值和“对象”布尔值的单独概念。

Go 确实具有“类型”与“指向该类型的指针”的概念,到达那里时,我们不得不担心空指针(将来会出现几篇文章!)。 现在,请放心,当您不处理指针时,Go类型的操作非常类似于Java原语。 Go使用合理的默认值对其进行初始化,实际上,编译器不允许您使用nil来初始化它们(即Go的null版本)。

字符和字符串

在Java中,String类型是一个类……没有将string作为基本类型的概念。 但是,Go中的分界线再次位于“类型”和“指向类型的指针”之间。 直接初始化非指针类型时,它类似于使用Java原语。

因此,不再有带字符串的null检查麻烦! 如果在不分配值的情况下初始化Go字符串,则默认情况下为它提供空字符串值(“”),而不是nil。

Unicode支持

说到赋值,Go字符串对Unicode非常友好。 Go源代码的文件格式为UTF-8 ,因此代码中声明的任何字符串文字都同样存储为UTF-8。 严格来说,Go字符串是一系列字节而不是字符数组,因此在某些极端情况下,字符串变量可能包含二进制数据(有关更多详细信息,请参见Go官方博客上的这篇有趣的文章 )。 但是,实际上,Go字符串通常都是UTF-8。

地鼠头

...
fmt.Printf("Escaped represention:\t %+q\n", "世界")
fmt.Printf("UTF-8 representation:\t %s\n", "\u4e16\u754c")
...

该程序的输出为:

Escaped represention:	 "\u4e16\u754c"
UTF-8 representation:	 世界

字符和子串

为了存储单个字符,Go的数据类型为符文。 符文类型是int32的别名(在下面的下一节中介绍),用于存储一个Unicode字符(或“代码点”)。 您可以使用零索引数组语法从字符串中提取单个符文或子字符串。 内置的Go函数len提供字符串的长度,以帮助您避免ArrayIndexOutOfBoundsException的Go等效项:

地鼠头

...
testString := "This is just a test string"

fmt.Printf("This string has %d characters\n", len(testString))
fmt.Printf("The 3rd character is: %c\n", testString[2])

lastRuneIndex := len(testString) - 1
fmt.Printf("The last character is: %c\n", testString[lastRuneIndex])

fmt.Printf("The third word in the sentence is: '%s'\n", testString[8:12])
...

该程序的输出为:

This string has 26 characters
The 3rd character is: i
The last character is: g
The third word in the sentence is: 'just'

当我们在下一篇文章中介绍数组和切片时,用于提取子字符串的testString [8:12]语法会更有意义。 现在,只知道冒号左侧的数字是子字符串的起始索引,而右侧的数字是结束索引。

标准的Go字符串函数

在Java中,String类包含许多用于处理,格式化和搜索字符串中字符的方法。 其他核心类包含用于在String和其他常见数据类型(例如Integer.parseInt(s))之间进行转换的方法。

对于Go,string实际上是内置的原始类型,没有任何方法。 因此, Go标准库包含两个软件包来填补这一空白:

  • 字符串 –搜索和操纵功能。 支持的操作包括拆分和连接,查找字符和子字符串,转换为小写或大写等。
  • strconv –在字符串和其他数据类型或输出格式之间转换的函数。

数值类型

类型因平台而异

关于用C编写的棘手事情之一是,数据类型在一个平台之间可能会有所不同。 一个整数可能在一台机器上占用32位,而在另一台机器上占用64位。 Java虚拟机具有“编写一次,就可以在任何地方运行”的口头禅,对程序员隐藏了这一点,并在所有平台上实施了一致的数据类型。

Go是部分组合,将两者结合在一起。 如果需要特定的大小,则可以声明特定的数字类型 (例如int32,int64)。 但是,如果仅将变量声明为int,则根据平台的不同,其大小可以从32位到64位不等。

实际上,这无关紧要。 即使在最坏的情况下,32位int的范围也足以满足大多数常规任务的需要。 同样,模棱两可的int是用于索引数组和切片的数据类型(将在下一篇文章中介绍)。 因此,一般的最佳做法是:

  • 当您需要至少32位的东西,并且不关心它是否更大时,请使用int
  • 仅在确实需要更大或更小的数字范围时才使用更具体的类型

这些是Go中可用的整数和浮点类型,以及每种类型的可能值范围:

去类型 相当于Java 范围
int8 字节 -128至127
int16 -32,768至32,767
int32 整型 -32,768至32,767
int64 -9,223,372,036,854,775,808至9,223,372,036,854,775,807
float32 浮动 1.40129846432481707e-45至3.40282346638528860e + 38,正负
float64 4.94065645841246544e-324d至1.79769313486231570e + 308d,正负


Go还提供了complex64和complex128类型,用于涉及虚数的高级数学运算。 尽管您可以在Apache Commons Math项目中找到类似的数据类型,但Java库中没有直接等效的类。

请注意,尽管Go具有不明确的int类型,具体取决于平台,它可能是32位或64位,但没有通用的浮点类型。 您必须指定float32或float64。 与整数类型不同,整数类型仅在可容纳的数字范围内有所不同,而32位浮点数和64位浮点数处理精度的方式存在细微差异。 这就是Java开发人员通常将BigDecimal用于金融交易的原因! 说到这,Go的标准库在其“ math / big ”包中提供了等效的类型。 Go类型的Int与Java的BigInteger相似,而Go的Rat (“理性”的缩写)与Java的BigDecimal相似。

Go具有带符号和未带符号的整数

Java中的所有整数基元均已签名。 这意味着,如果Java是唯一的编程语言,则您甚至可能都不知道有符号和无符号数字之间的区别 ! 本质上,有符号整数可以是正数或负数,而无符号整数只能是零和更高。 因此,对于无符号类型,您可以在相同的内存空间中获得两倍的范围,因此只要不需要存储任何负值即可。

去类型 范围
uint8 0至255
uint16 0至65,535
uint32 0至4,294,967,295
uint64 0至18,446,744,073,709,551,615

结论

对于Go的原始类型,您无需多加注意,例如字符串包含二进制数据的可能性,或者平台之间整数大小不同的事实。 总体而言,作为Java程序员,关于Go原语的许多事情可能为您带来新鲜空气。 Java在“基元”和“对象包装器”之间没有分歧,也没有自动装箱。 而且,除非您选择创建一个指针,否则没有NullPointerException!

在下一篇文章中,我们将研究如何在Go中创建自定义类型,以及Go的类型系统与Java中的面向对象的区别。

翻译自: https://www.javacodegeeks.com/2014/12/go-for-java-programmers-simple-types.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值