类型

欢迎来到Go系列教程的第四篇,本篇讲述的是Go的数据类型。

下面是Go存在的一些基础的类型。

  • bool
  • Number Types
    • int8,int16,int32,int64,int
    • uint8,uint16,uint32,uint64,uint
    • float32,float64
    • complex64,complex128
    • byte
    • rune
  • string

布尔类型-bool

一个布尔类型表示的是一个布尔值是true或是false

package main

import "fmt"

func main() {

	a := true
	b := false
	fmt.Println("a:",a,"b:",b)

	c := a && b
	fmt.Println("c:",c)

	d := a || b
	fmt.Println("d:",d)
}

在上面的程序中,a赋值为true,b赋值为false

c赋值为a && b的结果,这个&&运算符是只有当ab都为ture的时候才会返回true。所以这个语句返回的是false

||运算符是只要ab中有一个为true,那么它就会返回true。在上面事例中,因为atrue的,所以d就是true的。执行上面的程序,我们能得到下面的输出。

a: true b: false
c: false
d: true

有符号整数

int8: 表示8位的有符号整数
大小: 8位
范围: -128 - 127

int16: 表示16位的有符号整数
大小: 16位
范围: -32768 - 32767

int32: 表示32位的有符号整数
大小: 32位
范围: -2147483648 - 2147483647

int64: 表示64位的有符号整数
大小: 64位
范围: -9223372036854775808 - 9223372036854775807

int: 表示32位或64位的整型数,到底是32位还是64位,主要还是看是在哪个平台上。一般情况下你都是用的int来表示整数,除非你有指定的整数大小需求。
大小: 在32位系统是32位,在64位系统则是64位
范围: 在32位系统是-2147483648 - 2147483647,在64位系统是-9223372036854775808 - 9223372036854775807

package main

import "fmt"

func main() {

	var a int = 89
	b := 95
	fmt.Println("value of a is",a,"and b is",b)
}

上面的程序将会打印value of a is 89 and b is 95

在上面的程序中,a是int类型,b则是根据它的赋值(95)来推断它的类型。根据上面的规则,在32位系统中,int类型是32位的,在64位系统中则是64位的。下面我们就来验证下这个说法。

变量的类型可以在Printf函数中用%T格式说明符打印出来。Go有一个unsafe的包(package)里面有个函数Sizeof可以打印出参数所占字节的大小。但是在代码中使用unsale包还是要注意一点,就是它可能会有平台兼容性的问题,但是在我们这教程中使用当然是没问题的。

下面的程序输出了变量ab的类型和大小。%T是用来打印类型的,%是用来打印大小的。

package main

import (
	"fmt"
	"unsafe"
)

func main() {

	var a int = 89
	b := 95
	fmt.Println("value of a is",a,"and b is",b)
	fmt.Printf("type of a is %T,size of a is %d\n", a, unsafe.Sizeof(a))
	fmt.Printf("type of b is %T,size of b is %d", b, unsafe.Sizeof(b))
}

上面的程序将会产生下面的输出

value of a is 89 and b is 95
type of a is int,size of a is 8
type of b is int,size of b is 8

我们可以根据上面的输出推断ab都是int类型,它们都是64位bit(8byte)。但是如果上面的程序在32位系统上执行输出就会不一样,在32位系统,ab占32位字节(4byte)。

无符号整数

unit8:表示8位无符号整数
大小:8位
范围:0 - 255

unit16:表示16位无符号整数
大小:16位
范围:0 - 65535

unit32:表示32位无符号整数
大小:32位
范围:0 - 4294967295

unit64:表示64位无符号整数
大小:64位
范围:0 - 18446744073709551615

unit:根据当前所在的平台系统而定的32位或64位无符号整数
大小:32位在32位系统,64位在64位系统
范围:在32位系统,0 - 4294967295;在64位系统,0 - 18446744073709551615

浮点型

float32:32位浮点型数字
float64:64位浮点型数字

下面这个简单的程序就说明了整型和浮点型,

package main

import (
	"fmt"
)

func main() {

	a,b := 5.67,8.97
	fmt.Printf("type of a %T b %T\n", a, b)

	sum := a + b
	diff := a - b
	fmt.Println("sum",sum, "diff", diff)

	no1,no2 := 56,89
	fmt.Println("sum",no1 + no2, "diff",no1 - no2)
}

我们是根据ab的赋值来推断它们的类型。在上面的例子中,ab都是float64(float64是浮点数的默认类型)。我们将a加上b的值赋予变量sum,将ab的值赋予变量diff,然后打印出sumdiff。程序也对整型no1no2作了相似的计算。上面的程序将会打印出.

type of a float64 b float64
sum 14.64 diff -3.3000000000000007
sum 145 diff -33

复数类型

complex64:复数数字包括float32类型的真实部分和虚构部分
complex128:复数数字包括float64类型的真实部分和虚拟部分

内建函数complex是用真实部分和虚拟部分去构造一个复数数字。complex函数有下面的定义。

func complex(r, i FloatType) ComplexType

它是用一个真实的和一个虚拟的部分作为参数,然后返回一个复数类型。真实和虚拟的部分都必须是相同的类型,float32float64的。如果真实和虚拟部分都是float32类型的,那么这个函数将会返回一个complex64类型的复数数字。,如果真实和虚拟部分都是float64类型的,那么这个函数将会返回一个complex128类型的复数数字。

当然也可以用短语语法来生成一个复数数字。

c := 6 + 7i

让我们写一个简短的程序来更好地了解复数数字

package main

import (
	"fmt"
)

func main() {

	c1 := complex(5,7)
	c2 := 8 + 27i
	cadd := c1 + c2
	fmt.Println("sum:", cadd)
	cmul := c1 * c2
	fmt.Println("product:", cmul)
}

在上面的程序中,c1和c2是两个复数数字,c1用5作为真实部分,7作为虚拟部分。c2是8作为真实部分,27是虚拟部分。将c1和c2的和赋予变量cadd,c1和c2的乘积赋予cmul。下面是程序的输出.

sum: (13+34i)
product: (-149+191i)

其他的数字类型

byte 是unit8的别名
rune 是int32的别名

我们将会在学习string时,讨论更多bytes和runes的详细内容。

字符串类型

在Go中,字符串(strings)是字节(bytes)的集合。如果说你觉得这个定义没意义,没问题。现在我们假定字符串是字符(characters)的结合。我们将会学习string的更多内容在另外一篇教程。

我们用字符串写一个代码。

package main

import (
	"fmt"
)

func main() {

	first := "zhang"
	last := "san"
	name := first + " " + last
	fmt.Println("My name is ", name)

}

在上面的程序中,变量first赋值字符串"zhang",变量last赋值字符串"san".字符串可以用+操作符来连接。变量name的值就是通过连接变量first和变量last得来的。上面的程序就有输出My name is zhang san.

对于字符串我们还有很多不同的操作,我们将会在另外一个教程详细讨论。

类型转换

Go的显式类型是非常严格的,它的类型不会自动升级或转换。下面我们看看这个是什么意思。

package main

import (
	"fmt"
)

func main() {

	i := 55  // int
	j := 67.8
	sum := i + j // int + float64 not allowed
	fmt.Println(sum)
	

}

上面的代码在C语言中是完全合法的。但是在Go中,这就不能行,i是int类型,j是float64类型。将两个不同类型的数字相加是不允许的。当你执行这个程序时,你将会得到invalid operation: i + j (mismatched types int and float64)

为了修正这个错误,i和j应该要为同一个类型,我们可以转换j为int类型。T(v)这个语法就是转换v为T类型。

package main

import (
	"fmt"
)

func main() {

	i := 55  // int
	j := 67.8
	sum := i + int(j) // 转换j为int类型
	fmt.Println(sum)

}

现在你执行上面的程序,你就可以看到122的输出。

赋值时也是一样的,给一个变量赋值另外一种类型时也是需要显式类型转换的。可以看下面的代码解释。

package main

import (
	"fmt"
)

func main() {

	i := 10
	var j float64 = float64(i)  // 如果没有显示类型转换,这行代码就会报错
	fmt.Println("j",j)

}

var j float64 = float64(i)在这个语句中,把i转换成了float64类型,然后赋值给j。但是当你要把i赋值给j却没有转换类型时,那么代码编译时就会报错。

以上就是本篇的全部,感谢阅读,这是我第一次翻译,难免会有翻译不当的地方,如果有什么反馈和评论,欢迎提出来!

原文地址: https://golangbot.com/types/