正文
大家好,我又来了,接着上一期我们搭建了golang的环境变量后,我们接着看一下编程的基础常识。
众所周知在编程中,我们涉及到一下常用的东西:
-
数据类型
-
变量和常量
-
运算符
-
语句
-
数组、集合
-
方法
-
资源引入
-
包
1、数据类型
在go语言中,我们常见的数据类型有很多,但是值得注意的是,他们都是小写!都是小写!都是小写!
package builtin
type bool bool
const (
true = 0 == 0
false = 0 != 0
)
type uint8 uint8
type uint16 uint16
type uint32 uint32
type uint64 uint64
type int8 int8
type int16 int16
type int32 int32
type int64 int64
type float32 float32
type float64 float64
type complex64 complex64
type complex128 complex128
type string string
type int int
type uint uint
type uintptr uintptr
type byte = uint8
type rune = int32
const iota = 0
var nil Type
type Type int
type Type1 int
type IntegerType int
type FloatType float32
type ComplexType complex64
在上面的源码摘录中,我们可以看到go语言完整的数据类型。但是,我们总结下常用的如下:
-
int、uint 整形、无符号整形
-
int8、int16(2字节,-32768~32767)、int32(rune)、int64
-
uint8、uint16(2字节,0~65535)、uint32、uint64
-
string 字符串(原生utf-8编码支持)
-
bool 布尔型
-
float 浮点型
-
float32、float64 (4/8字节,精确到小数后7/15位)
-
byte 1字节 uint8的别名
-
nil 空类型
-
complex64、complex128 复数类型(实数、虚数),8字节、16字节
-
uintptr 足够大的位模式保存指针的整数类型(uintptr is an integer type that is large enough to hold the bit pattern of any pointer.)
同样的,还有一些派生数据类型(我个人喜欢称之为扩展数据类型或者是包装数据类型),基本如下:
-
指针类型(Pointer)
-
数组类型
-
结构化类型(struct)
-
Channel 类型
-
函数类型
-
切片类型
-
接口类型(interface)
-
map类型
当然这些扩展数据类型我们将在以后一一阐述。
go 1.9版本对于数字类型,无需定义int及float,系统会自动识别。
附赠demo小案例(完成变量的申明和使用,以及注意事项)
package main
import "fmt"
var (
personA = "小王"
personC = "小张"
ageA = 18
)
func main() {
mName := "程先生"
var mSex = "汉子"
fmt.Println(mName + ",哎哟我去,你是" + mSex)
var a = 1.5
var b = 2
fmt.Println(a, " ====我是分隔符==== ", b)
fmt.Println(personA, " ====我是分隔符==== ", personC, " ====我是分隔符==== ", ageA)
}
当然,运行结果如下:
程先生,哎哟我去,你是汉子
1.5 ====我是分隔符==== 2
小王 ====我是分隔符==== 小张 ====我是分隔符==== 18
在上面的代码中,有下面一些操作
-
必须申明包,且主程序包为:main
-
入口函数为:main,且没有任何参数
-
var为变量申明标识符
-
变量可以分组申明(导包可以分组吗?)
-
可以采用快捷申明变量 := ,注意:仅仅能在函数中使用
-
变量的基本数据类型无需申明,系统会自动推导
-
当然手动申明变量类型如: var aa string = "糍粑"
-
所有的变量都是使用过的(未使用的变量会产生编译异常)
-
java中输出语句基本数据类型和string可以通过“+”连接,但是go中不允许这种骚操作
-
变量可以即时申请
-
无需“;”结尾,换行既是语句的结束
-
虽然允许多变量一行赋值,但是不推荐如此做,所以也未举例
常量
常量是一个简单值的标识符,在程序运行时,不会被修改的量。
常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
常量定义格式: const identifier [type] = value
如下:
-
显式类型定义: const b string = "abc"
-
隐式类型定义: const b = "abc"
-
多个相同类型的声明可以简写为: const c_name1, c_name2 = value1, value2 (当然,我一样不推荐这样定义,降低了可读性)
那么我们试一试小demo
const PI = 3.14
r := 4
fmt.Println("圆的面积为:", PI*r*r)
在我们运行后代码报错如下:
# command-line-arguments
./demo001.go:26:38: constant 3.14 truncated to integer
上面代码提示PI被截断为整数,但是程序却没能成功运行,是不是go不支持数据类型自动转换呢?
我们这时候考虑一下把常量显示申明为float32试一试:
const PI float32 = 3.14
r := 4
fmt.Println("圆的面积为:", PI*r*r)
这次更加凄惨,代码甚至不能通过编译,在“PI *r *r”这里提示类型匹配错误!emmmm····
我们只能选择把r申明为float试试,如下:
const PI = 3.14
r := 4.0
fmt.Println("圆的面积为:", PI*r*r)
恭喜,本次编译通过,且有输出内容,如下:
圆的面积为: 50.24
当然如下代码也能成功运行:
const PI float32 = 3.14