序言
第一次写博客,笔者学过一遍C++基础,所以这次Go语言学习一些与C++相关的基础语法不再赘述,本篇博客用来自己学习记录使用,使用的材料主要是黑马程序员的Go教程如有遗漏或者错误的地方还请批评指正!
变量
变量声明
Go语言声明变量的格式:
var (变量名)(变量类型)
比如:
var ac int //定义一个【名字为ac】的【int型】【变量】
变量自动推导类型
C++11中有auto关键字可以用来推导变量的类型(编译阶段),Go语言中有更为方便的变量自动推导语法,具体格式为:
(变量名):=(值)
比如:
ad:=56//声明并初始化一个值为56的名字为ad的变量(推断出是int)
变量的多重赋值
Go语言中比较方便的一次定义或者赋值多个变量的语法,定义变量时格式如下:
(变量名1),(变量名2):=(值1),(值2)
比如:
//同时定义三个变量,a为int,b为float,c为字符串类型
a,b,c:=10,10.5,"haha"
给变量赋值的时候就是将“:=”改为“=”,注意变量类型,不再赘述。
多重赋值中的变量交换问题
在C/C++语言中,交换两个变量的值的方法有两个,一个是设置中间变量temp,一个是三段式互相加减。在Go中,使用变量的多重赋值功能进行互相赋值就可实现两个变量值的交换。
比如:
a:=10
b:=20
a,b=b,a//执行此句之后a为20,b为10
匿名变量
"_"为匿名变量,占一个变量的位置,没有意义,对应到匿名对象的值丢弃不使用,一般配合函数返回值进行使用。
比如:
_,b,_,d=1,2,3,4//b变量和d变量分别被赋值2和4
标准输出
输出函数封装在“fmt”包中,用之前需要import "fmt" 主要有三种输出形式——fmt.Print(),fmt.Println(),fmt.Printf()。其中格式化输入Printf函数的使用与C语言中的printf完全一样,所以不再赘述。
Println()函数打印括号内的参数到标准输出中,参数可以是常量和变量,打印时参数之间有空格,在每次打印的末尾自动添加换行符。
Print()函数用法和Print一样,但是参数中间没有空格,末尾也不会添加换行符。
标准输入
与输出函数一样,输入函数也封装在"fmt"包中 ,主要有三种输入形式——fmt.Scan()、fmt.Scanf()、fmt.Scanln()。其中格式化输入Scanf函数的用法与C语言scanf()函数完全一样。
Scan()函数内部参数时变量的地址,一般使用&(变量名)来进行调用,功能是读取以空白符分割的值返回到地址中进行修改。
Scanln()函数用法跟Scan一样,区别是只有在碰到换行符的时候才会停止扫描。
具体差别可看大佬写的博客:Go语言中 Scan 与 Scanf 和 Scanln的区别_@了凡的博客-CSDN博客_go语言scanln
数据类型
Go语言的数据类型和C/C++中的数据类型还是有很多不同的,Go语言的所有数据类型如下图所示(长度的单位是Byte而不是bit):
需要注意一下几点(学到后面再接着补充):
(1)bool类型占1【字节】,并且不可以像C++中一样使用数字来代替“true”和“false”。
(2)rune字符类型是unicode编码,一种相较于ASCII能代表更多字符的编码。
(3)string类型可以使用len()函数返回【有效字符个数】。
fmt包的格式化输入输出占位符
Go语言支持的格式化输入输出占位符相较于C还是有一些差别的,Go语言格式化输入输出占位符表如下所示:
常量
常量的定义
Go中常量的定义格式如下:
const (常量名) (数据类型) =(值)
比如:
const a int =10//定义一个名字为a,值为10的常量
此外还有一类常量是字面常量,一般用于左值或者函数传参时,是指程序中的【硬解码】常量。(什么是硬解码?)
iota 枚举
枚举是常量的集合的概念,iota是go语言中的常量计数器,配合常量表达式使用。在一个const声明语句中,在一个 const 声明语句中,在第一个声明的常量所在的行,iota 将会被置为 0,然后在每一个有常量声明的行加一。参考大佬的博客:go 中 iota 枚举的使用_Grassto的博客-CSDN博客_go 枚举iota
在【const语句块】中注意事项:
(1)iota在不同的const块不会互相干扰。
const a=iota //a=0
const( //注意这里是小括号
b=iota //b=1
c=iota //c=1
)
(2)没有表达式的常量定义复用上一行的表达式。
const (
a = "a" //a="a"
b //b="a"
c=iota //c=0
d //d=1
)
(3)_设置可跳过的值。
const(
a=iota*2 //0
b //2
-
d //6
)
简单的应用实例——定义数量级:
运算符
算数运算符
Go语言算数运算符的构成十分简单,只有加减乘除模后自增自减7种运算符,Go语言在算数运算符中与C/C++有以下不同之处:
(1)Go中没有前自增运算符(++a)、三目运算符(a>b?a:b)
(2)Go中不存在隐式类型转换,使用算数运算符运算的数据【必须】是统一数据类型
类型转换
Go 语言中不允许隐式转换,所有类型转换必须显式声明(Go语言所有的类型转换都是强制转换),而且转换只能发生在两种【相互兼容】的类型之间。Go语言的类型转换的形式主要有两种:
(1)类型(变量名):这种形式的类型转换要求新类型与原类型是等价的类型(相互兼容),即实现了相同的方法。
(2)变量名.(类型):这种形式用于向下转型,即接口对象转结构体对象,所以”变量名“必须是一个接口对象,这种形式在Go中叫做类型断言。
流程控制
选择结构
if-else 结构
if-else 结构与C语言相比唯一不同之处是【Go语言中条件语句没有括号】。
if a>10 {
fmt.Println(a)
}else if a<8 {
fmt.Println("hhhh")
}else {
fmt.Printfln("sss")
}
switch-case 结构
switch-case 结构与C语言switch-case相比主要有两点不同:
(1)switch后面直接接变量本身,变量不用加括号。
(2)Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用【fallthrough】强制执行后面的case代码
switch a {
case 1:
fmt.Print("11")
//fallthrough
case 2:
fmt.Print("22")
}
循环结构
在Go语言中【只有一种】循环结构——for循环结构,for循环共有两种使用方法,第一种使用方法除了条件不用加括号外与C语言中的for完全一致。
for i:=0;i<100;i++{
fmt.Println(i)
}
第二种使用方法类似于C++11中的 for range,Golang for range用来解决遍历【数组】和【切片】问题。
for i,data :=range args{}//i是编号,data是迭代器
注意:不管是选择结构还是循环结构,大括号是不可以省略的,即使只有一行语句也不可以 。