专栏首页子翔的专栏Go语言之旅:变量、常量及类型
原创

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

前言

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

	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语言目前没有泛型设计!

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go语言之旅:准备开发工具及HelloWorld

    在开发Golang应用的时候,我们首先遇到的问题是使用什么工具来开发,对Golang语言支持最好的应该是Goland,但是它收费,当然它也有一些免费策略,如果有...

    杨子翔 josonyang
  • Go语言之旅:环境搭建

    我是一名做了近十年的dotnet程序员,当然其中还使用过PHP、Javascript(NODEJS)去做过后端开发,从donnet Framework到现在的d...

    杨子翔 josonyang
  • Go语言之旅:类型转换

    在Go的类型转换中,不同于其他语言,任何的类型之间都没有隐形的转换。在写代码的过程中,我们经常会用到以下一些互相转换

    杨子翔 josonyang
  • 第13章 Kotlin 集成 SpringBoot 服务端开发(2)

    其中,ON DUPLICATE KEY UPDATE 这句表明当遇到重复的键值的时候,执行更新 gmt_modified = now() 的操作。这里nativ...

    一个会写诗的程序员
  • 5个经典的JavaScript面试题

    在IT界中公司对JavaScript开发者的要求还是比较高的,但是如果JavaScript开 发者的技能和经验都达到了一定的级别,那他们还是很容易跳到优秀的公司...

    wangxl
  • 一个利用正则表达式进行代码重构,去除冗余代码的例子

    现在的分支里每次执行检查都要先 var usRegx = /XXXX/. 实际上通过字面量定义了一个正则表达式对象,开销比定义一个String大。其实没必要每次...

    Jerry Wang
  • JavaScript面试题补充(1---5)

    在IT界中,JavaScript开发人员的需求量一直居高不下。如果你的能力能够胜任这一角色,那么你有很多机会换一家公司,并提高薪水。但在你被一家公司聘用之前,你...

    用户1272076
  • Linux 系统 /var/log/journal/ 垃圾日志清理

    版权声明:本文为米扑博客原创文章,未经米扑博客允许不得转载。 https://blog.csdn.net/sunboy_2050/article/det...

    阳光岛主
  • 用nodejs读取github上某仓库的某条issue明细

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

    Jerry Wang
  • Linux 系统 /var/log/journal/ 垃圾日志清理

    版权声明:本文为米扑博客原创文章,未经米扑博客允许不得转载。 https://blog.csdn.net/sunboy_2050/...

    阳光岛主

扫码关注云+社区

领取腾讯云代金券