Go基础——类型

Posted beiluowuzheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go基础——类型相关的知识,希望对你有一定的参考价值。

Go基本类型

bool

Numeric Types:

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

string

 

bool

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: false
d: true

  

这个运行结果很好理解,如果两个变量都为true,做&&运算就都为true,如果其中一个是true另一个是false,做&&运算为false,而||运算只要有一个为true,则结果为true

有符号整型

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

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

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

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

Go语言中的unsafe包下有一个Sizeof方法,它接受一个变量,并返回变量所占用的字节数。使用unsafe包我们需要小心,因为它可能会带来可移植性问题,不过在教程里没有关系。在下面一个例子中,我们使用%T打印变量的类型,使用%d打印其变量所占用的字节数

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
", a, unsafe.Sizeof(a))   //type and size of a
	fmt.Printf("type of b is %T, size of b is %d", b, unsafe.Sizeof(b)) //type and size of 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

  

如果打印结果,我们可以推断出上面的程序是运行在64位的系统上,因为如果是32位的系统,int会占4个字节,也就是32位,如果int占8个字节,则是在64位的系统上

无符号整型

uint8:表示 8 位无符号整型
大小:8 位
范围:0~255

uint16:表示 16 位无符号整型
大小:16 位
范围:0~65535

uint32:表示 32 位无符号整型
大小:32 位
范围:0~4294967295

uint64:表示 64 位无符号整型
大小:64 位
范围:0~18446744073709551615

uint:根据不同的底层平台,表示 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
	sum := a + b
	diff := a - b
	fmt.Println("sum:", sum, "diff:", diff)
	fmt.Printf("type of a %T b %T
", a, b)
	fmt.Printf("type of sum %T diff %T
", sum, diff)
}

  

运行结果:

sum: 14.64 diff: -3.3000000000000007
type of a float64 b float64
type of sum float64 diff float64

   

我们再次通过%T打印a和b的类型,可以看到a和b的类型都是float64,float64是浮点数的默认类型,然后我们将a和b相加,赋值给sum,a和b相减,赋值给diff,而sum和diff的类型同样是float64

复数类型

complex64: 实部和虚部为float32位的复数 
complex128: 实部和虚部为float64位的复数

内建函数complex可以用来构造一个带有实部和虚部的复数,complex函数的定义如下:

func complex(r, i FloatType) ComplexType  

  

这个函数接收一个实部和虚部的参数,并返回一个复数类型的值。实部和虚部必须是同一个类型。无论是float32还是float64。如果实部和虚部是float32,那么返回的值是complex64类型,如果实部和虚部都是floa64的类型,那么返回值的类型为complex128

package main

import "fmt"

func main() {
	r1, i1 := float32(5), float32(7)
	c1 := complex(r1, i1)
	fmt.Printf("type of c1 %T
", c1)
	//r2, i2 := 5, 7
	//c2 := complex(r2, i2)  如果将r2和i2传入,编译器会判断r2和i2为int类型,从而报出类型不匹配错误
	c2 := complex(5, 7) //编译器会将传入的5和7自动转换为float类型
	fmt.Printf("type of c2 %T
", c2)
	r3, i3 := float64(5), float64(7)
	c3 := complex(r3, i3)
	fmt.Printf("type of c3 %T
", c3)
}

  

运行结果:

type of c1 complex64
type of c2 complex128
type of c3 complex128

  

接下来,我们再看一下复数的相加和相乘。设c1=a+bi,c2=c+di是任意两个复数,则它们的和为(a+bi)+(c+di)=(a+c)+(b+d)i,它们的积为(a+bi)(c+di)=(ac-bd)+(bc+ad)i

package main

import "fmt"

func main() {
	c1 := complex(2, 3)
	c2 := 5 + 6i
	cadd := c1 + c2
	fmt.Println("cadd:", cadd)
	cmul := c1 * c2
	fmt.Println("cmul:", cmul)
}

  

运行结果:

cadd: (7+9i)
cmul: (-8+27i)

  

类型转换

Go对于类型的明确十分严格,这里没有类型自动转换

package main

import "fmt"

func main() {
	i := 55    //int
	j := 65.9  //float64
	k := i + j //int + float64 not allowed
	fmt.Println(k)
}

  

上面这一段代码将一个整型和一个浮点数相加,在很多语言是允许这么操作的,但在Go中是编译不通过的,因为这里Go是不会帮我们自动将整型转换成浮点类型,必须程序员手动转换

package main

import "fmt"

func main() {
	i := 55             //int
	j := 65.9           //float64
	k := i + int(j)     //将float64转换为int
	z := float64(i) + j //将int转换为float64
	fmt.Println(k)
	fmt.Println(z)
}

  

修改成这样,就能通过编译顺利运行了

string类型

在Go语言中,string是字节的集合,同Java和Python一样,Go语言也支持字符串的“+”操作

package main

import "fmt"

func main() {
	hello := "hello"
	world := "world"
	result := hello + " " + world
	fmt.Println(result)
}

  

运行结果:

hello world

  

其他数字类型

byte:uint8的别称
rune:int32的别称

在后面的章节还会再介绍字符串、byte和rune这几种类型






















以上是关于Go基础——类型的主要内容,如果未能解决你的问题,请参考以下文章

Go语言基础语法(一)

每天一点Go语言——Go语言语法基础及基本数据类型

Go 系列教程 —— 17. 方法

go语言学习笔记 — 基础 — 基本语法 — 类型相关:类型定义与类型别名

[日常] Go语言圣经--作用域,基础数据类型,整型

解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段