前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言之旅:变量、常量及类型

Go语言之旅:变量、常量及类型

原创
作者头像
杨子翔 josonyang
修改2019-09-02 23:19:39
5300
修改2019-09-02 23:19:39
举报
文章被收录于专栏:子翔的专栏子翔的专栏

前言

因为面向dotnet(C#)的程序员有很多基础语言的知识已经具备,在这一节,我会把那些Golang特别的或者需要注意的部分摘出来,加以演示可能会更快上手和了解。还是从最简单的变量定义、类型、操作符、控制语句等等入手

正题

变量

Go 是静态类型的编译型语言,这就意味着要么事先定义了变量类型,要么是在编译器编译的时候判定了类型。但在编写的过程中Go的写法却很灵活,比如我们通常这么定义变量,在Go语言中是不需要用";"来结束一行的,有的时候习惯写法给加上了,gopls format也给干掉了,它会根据Go语言的标准来检查,这样非常好!

代码语言:txt
复制
var PlateNumber string
var MaxPeople int

而我们还可以这样

代码语言:txt
复制
var (
    PlateNumber string ="粤BXXXXX"
    MaxPeople int = 50
)

我们在之前看到多个import的时候也是通过一对括号来统一定义和导入的。这种定义都是属于已经指定了类型的定义方式,在Go里面可以这样去定义变量。

代码语言:txt
复制
    PlateNumber := "粤BXXXXX"
    MaxPeople := 50

":="不用提前定义,如果前面定义了变量是不能写这个的,得老老实实写"="的,所以一般可以说用到了才定义的做法,编译器会自动判断它的类型。

还有一种匿名变量用下划线表示”_”不会分配内存,只是一个变量占符,表示接受不需要使用的返回变量,比如我们遇到一个内容,比如在接收一个方法的返回时,其中一个返回参数我不需要关注,但是需要一个占位,就可以用这个办法

代码语言:javascript
复制
   Driver,_,PlateNumber := "小明",32,"粤BXXXXX" 

常量

常量也是用const,定义方法跟变量一样,只是":="操作符不能用而已,跟其他语言一样,一旦定义了之后是不能再赋值改变的,问题来了

代码语言:txt
复制
    const MaxPeople float = 50
    const MaxPeople = 50

他们都是表达一个最大50人的定量,那么前者指定了一个为浮点,后者因为编译器的关系会自动判定为int,这一种数值判定。还有一种是位于代码逻辑中的需要计算的部分,比如以下,你绝对会想不到在Go语言里面的得数是3!

代码语言:txt
复制
var result = 7 / 2

没错,就是3,如果要正常的算出我们想要的3.5,那么必须

代码语言:txt
复制
var result = 7 / 2.0
var result = 7.0 / 2
var result = float64(7) / 2

哇,那这么写代码岂不很头疼?其实“7”和“2”在Go语言里面是没有定义类型的常量,Go的编译器会自动处理,因此在做数值计算或者在定义类似公有数值变量的时候,养成习惯一定要指定一下类型

代码语言:txt
复制
const thatNum float64 = 7
var result = thatNum / 2

类型

类型

默认值

bool

false

string

""

int,intxx,uintxx

0

float,floatxx

0.0

一般的类型基本上是所有强类型语言都有的,但是这里有个很有意思的内容,就是容量大小,本身每个类型的定义的范围就有不同,而在我们在Struct使用他们的时候也会有所不同,而这个不同跟排列顺序有关系,比如说以下的例子

代码语言:javascript
复制
 struct {
	MaxPeople      int
	GpsDeviceNo    string
	IsNews bool
	PowerType      string
	Oil float32
}

那么这个Struct的内存结构是这样的

但是如果调整一下顺序之后,将Oil和IsNew排列到一起

代码语言:javascript
复制
 struct {
	MaxPeople      int
	GpsDeviceNo    string
	IsNews bool
	Oil float32
	PowerType      string
}

它的内存消耗是这样的

由此我们可以看出类Struct在定义的时候,顺序的关系会影响到内存的分配大小,这个可以通过http://golang-sizeof.tips 来查看这个有趣的过程

字符串类型

字符串类型中主要有两种一种是普通的,一种是直接可以输出段落的。

代码语言:txt
复制
    // \r\n起作用了
	var normalStr = "今天天气不错\r\n"
    // \r\n 原样输出
	var rawStr = `今天天气不错
										小王和小明出去打篮球\r\n`
	fmt.Printf("%v", normalStr)
	fmt.Printf("%v", rawStr)
image.png
image.png
rune类型

// 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型,为毛还要搞一个这个呢?我们看个例子,这里不看以后就可能是个坑,因为我们通常在截取文字的时候会计算字符串的长度因此我们会这样做

代码语言:txt
复制
	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来处理就可以了

代码语言:txt
复制
	var normalStr = "今天天气不错"
	fmt.Printf("%v", utf8.RuneCountInString(str))
	fmt.Printf("%v", len([]rune(normalStr)))
枚举?!

先看一段dotnet(C#)的枚举定义,然后周日是每天的第一个天序号就是1-7,其实Go没有像这样的枚举类型,但是可以实现枚举的一些作用

代码语言:javascript
复制
enum Days
{
    None = 0,
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

我们用Go语言来定义就是这样定义,并且都是从0开始序号,而且iota是Go语言的常量计数器,只能在常量的表达式中使用,遇到const就重置为0开始了

代码语言:javascript
复制
type Day int
const(
    None Day = iota,
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
)

如果中间我们有需要改变值,比如当前Saturday我们是用序号7来表示,现在需要改为序号9来表示,可以使用下划线“-”来占位

代码语言:javascript
复制
const (
	None Day = iota
	Sunday
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	_
	_
	Saturday
)

泛型?!

Go语言目前没有泛型设计!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正题
    • 变量
      • 常量
        • 类型
          • 字符串类型
          • rune类型
          • 枚举?!
          • 泛型?!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档