因为面向dotnet(C#)的程序员有很多基础语言的知识已经具备,在这一节,我会把那些Golang特别的或者需要注意的部分摘出来,加以演示可能会更快上手和了解。还是从最简单的变量定义、类型、操作符、控制语句等等入手
Go 是静态类型的编译型语言,这就意味着要么事先定义了变量类型,要么是在编译器编译的时候判定了类型。但在编写的过程中Go的写法却很灵活,比如我们通常这么定义变量,在Go语言中是不需要用";"来结束一行的,有的时候习惯写法给加上了,gopls format也给干掉了,它会根据Go语言的标准来检查,这样非常好!
var PlateNumber string
var MaxPeople int
而我们还可以这样
var (
PlateNumber string ="粤BXXXXX"
MaxPeople int = 50
)
我们在之前看到多个import的时候也是通过一对括号来统一定义和导入的。这种定义都是属于已经指定了类型的定义方式,在Go里面可以这样去定义变量。
PlateNumber := "粤BXXXXX"
MaxPeople := 50
":="不用提前定义,如果前面定义了变量是不能写这个的,得老老实实写"="的,所以一般可以说用到了才定义的做法,编译器会自动判断它的类型。
还有一种匿名变量用下划线表示”_”不会分配内存,只是一个变量占符,表示接受不需要使用的返回变量,比如我们遇到一个内容,比如在接收一个方法的返回时,其中一个返回参数我不需要关注,但是需要一个占位,就可以用这个办法
Driver,_,PlateNumber := "小明",32,"粤BXXXXX"
常量也是用const,定义方法跟变量一样,只是":="操作符不能用而已,跟其他语言一样,一旦定义了之后是不能再赋值改变的,问题来了
const MaxPeople float = 50
const MaxPeople = 50
他们都是表达一个最大50人的定量,那么前者指定了一个为浮点,后者因为编译器的关系会自动判定为int,这一种数值判定。还有一种是位于代码逻辑中的需要计算的部分,比如以下,你绝对会想不到在Go语言里面的得数是3!
var result = 7 / 2
没错,就是3,如果要正常的算出我们想要的3.5,那么必须
var result = 7 / 2.0
var result = 7.0 / 2
var result = float64(7) / 2
哇,那这么写代码岂不很头疼?其实“7”和“2”在Go语言里面是没有定义类型的常量,Go的编译器会自动处理,因此在做数值计算或者在定义类似公有数值变量的时候,养成习惯一定要指定一下类型
const thatNum float64 = 7
var result = thatNum / 2
类型 | 默认值 |
---|---|
bool | false |
string | "" |
int,intxx,uintxx | 0 |
float,floatxx | 0.0 |
一般的类型基本上是所有强类型语言都有的,但是这里有个很有意思的内容,就是容量大小,本身每个类型的定义的范围就有不同,而在我们在Struct使用他们的时候也会有所不同,而这个不同跟排列顺序有关系,比如说以下的例子
struct {
MaxPeople int
GpsDeviceNo string
IsNews bool
PowerType string
Oil float32
}
那么这个Struct的内存结构是这样的
但是如果调整一下顺序之后,将Oil和IsNew排列到一起
struct {
MaxPeople int
GpsDeviceNo string
IsNews bool
Oil float32
PowerType string
}
它的内存消耗是这样的
由此我们可以看出类Struct在定义的时候,顺序的关系会影响到内存的分配大小,这个可以通过http://golang-sizeof.tips 来查看这个有趣的过程
字符串类型中主要有两种一种是普通的,一种是直接可以输出段落的。
// \r\n起作用了
var normalStr = "今天天气不错\r\n"
// \r\n 原样输出
var rawStr = `今天天气不错
小王和小明出去打篮球\r\n`
fmt.Printf("%v", normalStr)
fmt.Printf("%v", rawStr)
// rune is an alias for int32 and is equivalent to int32 in all ways. It is // used, by convention, to distinguish character values from integer values.
type rune = int32
官方解释告诉我们它就是个int32型,为毛还要搞一个这个呢?我们看个例子,这里不看以后就可能是个坑,因为我们通常在截取文字的时候会计算字符串的长度因此我们会这样做
var normalStr = "今天天气不错"
fmt.Printf("%v", len(normalStr))
你会得到一个很诡异的结果,那就是18!总共才6个汉字!!!那是因为Go的string的基础是byte数组,而中文字符在UTF-8编码(Go编码)下占3个字节,因此就是18个,len也就是算的这个数组的长度
The len built-in function returns the length of v, according to its type: Array: the number of elements in v.
我们要这么处理才能取的我们想要的结果,utf8.RuneCountInString来处理就可以了
var normalStr = "今天天气不错"
fmt.Printf("%v", utf8.RuneCountInString(str))
fmt.Printf("%v", len([]rune(normalStr)))
先看一段dotnet(C#)的枚举定义,然后周日是每天的第一个天序号就是1-7,其实Go没有像这样的枚举类型,但是可以实现枚举的一些作用
enum Days
{
None = 0,
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
我们用Go语言来定义就是这样定义,并且都是从0开始序号,而且iota是Go语言的常量计数器,只能在常量的表达式中使用,遇到const就重置为0开始了
type Day int
const(
None Day = iota,
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
)
如果中间我们有需要改变值,比如当前Saturday我们是用序号7来表示,现在需要改为序号9来表示,可以使用下划线“-”来占位
const (
None Day = iota
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
_
_
Saturday
)
Go语言目前没有泛型设计!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。