由php转golang就像把一个固有封建思维的人强制要转型为思想前卫新潮的人,改变有一个过程,虽然痛苦但是乐在其中。由于php弱类型,不区分变量类型,而go就需要区分变量类型,在不同使用的场景使用不用的变量类型,就要求我们打破平时的思维,来一场火星撞地球的变革。


在使用php的过程中,我们完全不用考虑一个变量的类型是什么只需要一个$符号申明即可,相对go来说简直不要太人性化,因此学go就得选择性的忘记,忘记一些不该有的,记的是逻辑的共通性。


首先我们这里要深刻理解golang中各个数据类型,因为变量是基础,在各个语言中、各个功能模块中少不了变量,我们要精准的声明变量类型就需要我们深刻理解数据类型。下面我们介绍一下go的基础数据类型。


在golang中基础数据类型有18种分别是:

boolstringrunebyteint64uint64
intuintint8uint8complex64complex128
int16uint16int32uint32float32float64

|  bool

布尔类型用来表示真假两种情况,bool类型的变量只有两种情况,一种是true,另一种是false。定义bool类型变量方法是:

var a bool

bool类型变量默认初始值是false。bool类型变量只能用true、false、返回bool类型变量的表达式赋值。如下边的赋值方法:

var a bool = true
b := false
c := 1==1


|string


字符串类型,用来表示一个或多个字符和集合。定义字符串类型的语法格式是:

var str1 string
var str2 string = "hello world"
var str3 = "hello world"
str4 := "hello world"


string类型变量在定义后默认的初始值是空,不是nil。在程序中判断一个字符串类型变量是否的方法是:

var str string
if str == "" {
    // str 为空
}


或者使用len函数获取字符串类型变量的长度,实现方式是:

var str string
if len(str) == 0 {
    // str 为空
}

len是golang内置的一个函数,这个函数返回字符串的长度,切片长度,数组长度,通道长度。如果用于获取字符串长度时,当字符串为空,len返回值是0。


|  rune

rune类型是int32的一个别名,rune主要用于表示utf-8编码时的字符类型。通常情况下一个字符就是一个字节,在golang中用byte关键字来表示字节,而utf-8编码的字符,可能会存在一个字符用四个字节表示。如果使用byte类型来存储utf-8编码的字符串,就会导致读取单个字节时,值没有意义的情况。所以golang中使用rune来存储utf-8编码的字符。

package main

import (
	"fmt"
)

func demoRune(arg []rune) {
	fmt.Println("rune 参数长度是:", len(arg))
	for i := 0; i < len(arg); i++ {
		fmt.Printf("%d,%c\n", i, arg[i])
	}
}

func demoString(arg string) {
	fmt.Println("string 参数长度是:", len(arg))
	for i := 0; i < len(arg); i++ {
		fmt.Printf("%d,%c\n", i, arg[i])
	}
}

func main() {
	var str = "和平"
	fmt.Println("rune类型遍历结果是:")
	demoRune([]rune(str))
	fmt.Println("string 类型遍历结果是:")
	demoString(str)
}

输出信息是:

rune类型遍历结果是:
rune 参数长度是: 2
0,和
1,平
string 类型遍历结果是:
string 参数长度是: 6
0,å
1,’
2,Œ
3,å
4,¹
5,³

当使用byte来读取字符时,抽选了乱码显现,主要原因是一个汉字不是一个字节。所以当字符串中有汉字时,采用rune类型能够比较方便的存储和读取。


rune类型变量默认初始值是0


|   byte


byte用来表示字节,一个字节是8位。定义一个字节类型变量的语法是:

var b1 byte
var b2 = 'c'
var b3 byte = 'c'
b4 := 'c'

byte类型变量默认初始值是0。byte类型是uint8类型的一个别名。


|  int

有符号整数类型,在golang中,整数类型长度与操作系统有关,32位系统中,整数类型长度是4个字节,在64位系统中,整数类型长度是8个字节。定义整数类型语法是:

var n1 int
var n2 int = 8
var n3 = 8
n4 := 8


整数类型默认初始值是0,上边变量n1之定义,没有初始化,系统默给n1变量赋值0。


unit

无符号整数类型,无符号整数表示只能为正的整数。uint类型长度与操作系统有关,32位操作系统中,uint类型长度是4个字节,64位操作系统中,uint类型长度是8个字节。定义无符号类型变量语法是:

var un1 uint
var un2 uint = 8
var un3 = 8
n4 := 8

无符号整型默认初始值是0。


|  int8

int8表示一个8位的整型类型,取值范围是:-128 至 127。与byte类型占用空间一样,在内存中占用1个字节。定义int8类型变量方法阿是:

var n81 int8
var n82 int8 = 8
var n83 = 8
n84 := 8


int8类型变量默认初始值是0。


|  uint8

无符号8位整数类型,取值范围是:0 至 255。在内存中占用1个字节。定义uint8类型变量方法是:

var un81 uint8
var un82 unit8 = 8
var un83 = 8
un84 := 8

uint8类型变量默认初始值是0。


 int16

16位整数类型,取值范围是:-32768 至 32767,在内存中占用2个字节存储空间。定义int16类型变量方法是:

var n161 int16
var n162 int16 = 8
var n163 = 8
n164 := 8

int16整数类型变量默认初始值是0。


 uint16

16位无符号整数类型,取值范围是:0 至 65535。在内存中占用2个字节存储空间。定义uint16类型变量方法是;

var un161 int16
var un162 int16 = 8
var un163 = 8
un164 := 8


uint16类型变量默认初始值是0 。


|   int32

32位整数类型,取值范围是:-2147483648 至 2147483647。在内存中占用4个字节存储空间。定义int32类型变量方法是;

var n321 int16
var n322 int16 = 8
var n323 = 8
n324 := 8

int32类型变量默认初始值是0 。


|   unit32

32位无符号整数类型,取值范围是:0 至 4294967295。在内存中占用4个字节存储空间。定义uint132类型变量方法是;

var un321 int16
var un322 int16 = 8
var un323 = 8
un324 := 8


uint32类型变量默认初始值是0 。


|  int64

64位整数类型,取值范围是:-9223372036854775808 至 9223372036854775807。在内存中占用8个字节存储空间。定义int164类型变量方法是;

var n641 int64
var n642 int64 = 8
var n643 = 8
n644 := 8


int64类型变量默认初始值是0 。


|  uint64

64无符号位整数类型,取值范围是:0 至 18446744073709551615。在内存中占用8个字节存储空间。定义uint164类型变量方法是;

var un641 int64
var un642 int64 = 8
var un643 = 8
un644 := 8

uint64类型变量默认初始值是0 。


|  float32

单精度浮点数,取回范围是:1.401298464324817070923729583289916131280e

-45 至 3.402823466385288598117041834516925440e

+38

定义单精度浮点数语法是:

var f321 int64
var f322 int64 = 8
var f323 = 8
f324 := 8

float32类型变量默认初始值是0。


|  float64

双精度浮点数,取回范围是:4.940656458412465441765687928682213723651e

-324 至 1.797693134862315708145274237317043567981e

+308

定义单精度浮点数语法是:

var f641 int64
var f642 int64 = 8
var f643 = 8
f644 := 8

float64类型变量默认初始值是0。


|  complex64

64位 复数类型,复数由两部分组成,分别是实部和虚部,创建复数类型变量的方法是:

var c1 complex64 = complex(实部值,虚部值)
var c2 complex64 = 实部值 +虚部数字值i


复数实部使用数字表示,虚部使用数字加小写i表示。


|  complex128

128位 复数类型,复数由两部分组成,分别是实部和虚部,创建复数类型变量的方法是:

var c1 complex128 = complex(实部值,虚部值)
var c2 complex128 = 实部值 +虚部数字值i

复数实部使用数字表示,虚部使用数字加小写i表示。

golang中提供了两个内置函数来操作复数的实部和虚部,使用real(复数变量)来获取复数的实部值,imag(复数变量)来获取复数的虚部部分。