Go 语言快速开发入门(基础语法详解,第一节)
Go 语言快速开发入门(基础语法详解,第一节)
- 一、基础语法详解,第一节
- 1、HelloWorld
- 1.1、代码编写和解释
- 1.2、go语言注意事项
- 2、Go 语言的转义字符&&Go 语言注释
- 2.1、常用制表符
- 2.2、注释
- 3、变量
- 3.1、变量声明方式
- 3.2、常量声明方式
- 4、基本数据类型
- 4.1、整型
- 4.2、浮点型
- 4.3、布尔值
- 4.4、字符串
- 4.5、基本数据类型默认值
- 5、复杂数据类型
- 5.1、指针
- 5.2、数组
- 5.2.1、一维数组
- 5.2.2、二维数组
- 5.3、切片
- 6、值类型和引用类型
- 7、运算符
- 7.1算术运算符
- 7.2关系运算符
- 7.3逻辑运算符
- 7.4 赋值运算符
- 8、流程控制
- 8.1、if流程
- 8.2、switch流程
- 9、函数和包
- 9.1函数
一、基础语法详解,第一节
1、HelloWorld
1.1、代码编写和解释
代码如下,对下图代码进行解释:
1、代码中的package main,表示这是可以执行main方法的文件,如果Test.go文件不放在main目录下,也可以写成package main,不过通常是放在main包中。
2、import “fmt” 表示引入一个包,包名 fmt, 引入该包后,就可以使用 fmt 包的函数,比如:fmt.Println。
3、func main() {} 表示一个main方法,类似java中的main方法,是go的入口。
4、fmt.Println(“hello,world”) 表示调用Println输出。
5、程序运行,如下图,右键单击即可运行。
1.2、go语言注意事项
- Go 源文件以 “go” 为扩展名。
- Go 应用程序的执行入口是 main()函数,但是main函数的所在包必须是package main。
- Go 语言严格区分大小写。
- Go 方法由一条条语句构成,每个语句后不需要分号(Go 语言会在每行后自动加分号),这也体现出 Golang 的简洁性。也就是说go的一行只能写一句代码。
- go 语言定义的变量或者 import 的包如果没有使用到,代码不能编译通过且开发工具会自定删除掉。
- 大括号都是成对出现的,缺一不可。且面朝右面的大括号左边必须有代码。
2、Go 语言的转义字符&&Go 语言注释
2.1、常用制表符
- \t : 表示一个制表符,通常使用它可以排版。
- \n :换行符
- \\ :一个\
- \" :一个"
- \r :一个回车 fmt.Println(“a\rb”);
2.2、注释
Golang 中注释有两种形式
1、行注释
//注释内容
2、块注释(多行注释)
/*
注释内容
*/
下图代码举例
func main() {//一个制表符的距离fmt.Println("刘备\t猴子")//换行fmt.Println("姜子牙\n高端局")//\r回车, \r后面的覆盖掉前面的fmt.Println("王者荣耀\r英雄联盟")/*这是多行注释这是多行注释*/
}
3、变量
3.1、变量声明方式
import "fmt"/**
变量声明和使用
*///变量声明六:一次声明多个全局变量(方法外的变量是全局变量)
var (n3 = 100n4 = 400name3 = "zg"
)
//一次声明一个全局变量
var name4 = "zgg"func main() {//变量声明方式一,如果不指定变量值,则使用默认值var i inti = 90fmt.Println(i)//变量声明方式二:根据值自行判定变量类型(类型推导)var age = 20fmt.Println(age)//变量声明方式三:省略 var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误,只能在当前函数作用域中使用,不能作为全局变量name := "zhanggang"fmt.Println(name)//变量声明方式四: var 变量名 类型 = 表达式var name2 string = "zhanggang"fmt.Println(name2)//变量声明方式五:一次声明多个变量n1, n2, vmId := 1, 2, "fe7772b4-8dfc-4b23-8916-616d79c53b31"fmt.Println(n1, n2, vmId)fmt.Println(n3, n4, name3, name4)
}
3.2、常量声明方式
常量的定义: 相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的那些值。常量的声明和变量声明非常类似,只是把 var 换成了 const,常量在定义的时候必须赋值。
func main() {//声明单个常量const pi1 = 3.1415//声明多个常量const (pi2 = 3.1415e = 2.7182)//const 同时声明多个常量时,如果省略了值则表示和上面一行的值相同,N1=N2=N3=100const (N1 = 100N2N3)
}
4、基本数据类型
Go 语言中数据类型分为: 基本数据类型和复合数据类型。
基本数据类型有: 整型、浮点型、布尔型、字符串
复杂数据类型有: 指针、数组、切片、结构体、函数、map、通道(channel)、接口等。
4.1、整型
1、整型分为以下两个大类
有符号整形按长度分为:int8、int16、int32、int64
对应的无符号整型:uint8、uint16、uint32、uint64
2、特殊整型
注意: 在使用 int 和 uint 类型时,不能假定它是 32 位或 64 位的整型,而是考虑int 和uint
可能在不同平台上的差异。在涉及到二进制传输、为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用 int 和 uint。
3、代码演示
import ("fmt""unsafe"
)/**
基本数据类型
*/
func main() {//整数类型var num = 123fmt.Printf("值:%v 类型%T ", num, num)//返回 num 变量占用的字节数fmt.Println(unsafe.Sizeof(num))
}
4.2、浮点型
注意:
1、Go 语言支持两种浮点型数:float32 和 float64。
2、Go 语言中浮点数默认是 float64。
3、Golang 中 float 精度丢失,几乎所有的编程语言都有精度丢失这个问题,这是典型的二进制浮点数精度损失问题,在定长条件下,二进制小数和十进制小数互转可能有精度丢失。
代码演示
func main() {num := 1.1//Go 语言中浮点数默认是 float64fmt.Printf("值:%v--类型:%T", num, num) //值:1.1--类型:float64m1 := 8.2m2 := 3.8fmt.Println(m1 - m2) // 期望是 4.4,结果打印出了 4.399999999999999,这就是丢失精度//Golang 科学计数法表示浮点类型num8 := 5.1234e2 // ? 5.1234 * 10 的 2 次方num9 := 5.1234e2 // ? 5.1234 * 10 的 2 次方 shift+alt+向下的箭头num10 := 5.1234e-2 // ? 5.1234 / 10 的 2 次方 0.051234fmt.Println("num8=", num8, "num9=", num9, "num10=", num10)
}
4.3、布尔值
Go 语言中以 bool 类型进行声明布尔型数据,布尔型数据只有 true(真)和false(假)两个值。
注意:
- 布尔类型变量的默认值为 false。
- Go 语言中不允许将整型强制转换为布尔型.
- 布尔型无法参与数值运算,也无法与其他类型进行转换。
import ( "fmt"
"unsafe"
)
func main() {var b = true
fmt.Println(b, "占用字节:", unsafe.Sizeof(b))
}
4.4、字符串
注意: Go 语言中的字符串属于基础数据类型。
声明字符串代码演示
func main() {//声明一个字符串变量s1 := "hello"//多行字符串,就是一个很长的字符串,需要换行,必须使用反引号字符//反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。s2 := `你好
漂亮的go语言`fmt.Println(s1, s2)
}
字符串API常用方法
func main() {//len(str)求字符串的长度var str = "this is str"fmt.Println(len(str))//拼接字符串var str1 = "你好"var str2 = "golang"fmt.Println(str1 + str2)var str3 = fmt.Sprintf("%v %v", str1, str2)fmt.Println(str3)//strings.Split 分割字符串var strSpi = "123-456-789"var arr = strings.Split(strSpi, "-")fmt.Println(arr)//判断一个字符串是否包含另一个字符串var str4 = "this is golang"var flag = strings.Contains(str4, "golang")fmt.Println(flag)//判断首字符尾字母是否包含指定字符var str5 = "this is golang"var flag2 = strings.HasPrefix(str5, "this")fmt.Println(flag2)
}
4.5、基本数据类型默认值
代码演示
func main() {var a intvar b float64var c boolvar d stringfmt.Println(a, b, c, d)
}
5、复杂数据类型
复杂数据类型有: 指针、数组、切片、结构体、函数、map、通道(channel)、接口等。
5.1、指针
注意:
1、对于基本数据类型来说,变量存的就是值,也叫值类型,而指针就是指向值的一个地址。 举例说明下,var num int = 999,内存中会有两块地方存储,一块存储值10,另一块存储值10的内存地址。通过&num可以获取num的内存地址,var ptr *int = &num 这就是声明一个指向num内存的指针。
2、*int表示这个指针的类型
3、值类型都有对应的引用类型,
值类型包括:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体struct
引用类型:指针、slice 切片、map、管道 chan、interface 等都是引用类型
代码演示
func main() {var i int = 999fmt.Println("i的地址是=", &i)//*int表示这个指针的类型var ptr *int = &ifmt.Printf("ptr=%v\n", ptr)fmt.Printf("ptr的地址是=%v\n", &ptr)fmt.Printf("ptr指向的值是=%v", *ptr)
}
下图的指针在内存中的指向
一个小案列,通过指针修改变量的值
func main() {var i int = 999fmt.Println("i的值是=", i)var ptr *int = &i*ptr = 100 //在内存中,*ptr指向的值就是i的,所以能修改i的值fmt.Println("i的值是=", i)
}
5.2、数组
5.2.1、一维数组
数组定义: var 数组变量名 [元素数量]T
定义一个长度为 3 元素类型为 int 的数组 b 并赋值。
var b [3]intb[0] = 80b[1] = 100b[2] = 96//根据数组下表获取值fmt.Println(b[0])
数组的初始化 方法一
var testArray [3]int //数组会初始化为int 类型的零值var
var numArray = [3]int{1, 2} //使用指定的初始值完成初始化
var cityArray = [3]string{"北京", "上海", "深圳"} //使用指定的初始值完成初始化
fmt.Println(testArray) //[0 0 0]
fmt.Println(numArray) //[1 2 0]
fmt.Println(cityArray) //[北京 上海 深圳]
数组的初始化 方法二
按照方法一的方法每次都要确保提供的初始值和数组长度一致,一般情况下我们可以让编译器根据初始值的个数自行推断数组的长度。
var testArray [3]int
var numArray = [...]int{1, 2}
var cityArray = [...]string{"北京", "上海", "深圳"}
fmt.Println(testArray) //[0 0 0]
fmt.Println(numArray) //[1 2]
fmt.Printf("type of numArray:%T\n", numArray) //type of numArray:[2]int
fmt.Println(cityArray) //[北京 上海 深圳]
fmt.Printf("type of cityArray:%T\n", cityArray) //type of cityArray:[3]string
数组的初始化 方法三
使用下标索引初始化
a := [...]int{1: 1, 3: 5}fmt.Println(a) // [0 1 0 5]fmt.Printf("type of a:%T\n", a) //type of a:[4]int
遍历数组的两种写法
var a = [...]string{"北京", "上海", "深圳"}// 遍历 1:for 循环遍历for i := 0; i < len(a); i++ {fmt.Println(a[i])}// 遍历 2:range 循环遍历for index, value := range a {fmt.Println(index, value)}
5.2.2、二维数组
var 数组变量名 [元素数量][元素数量]T
二维数组定义
func main() {a := [3][2]string{{"北京", "上海"}, {"广州", "深圳"}, {"成都", "重庆"}}fmt.Println(a) //[[北京 上海] [广州 深圳] [成都 重庆]]fmt.Println(a[2][1]) //支持索引取值:重庆
}
二维数组遍历
func main() {a := [3][2]string{{"北京", "上海"}, {"广州", "深圳"}, {"成都", "重庆"}}for _, v1 := range a {for _, v2 := range v1 {fmt.Printf("%s\t", v2)}fmt.Println()}
}
注意:
1、Go 语言是支持多维数组的,我们这里是以二维数组为例。
2、多维数组只有第一层可以使用…来让编译器推导数组长度。
3、数组是值类型,传参相当于值拷贝,不改变原有的值。
5.3、切片
切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。
因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性,所以我们才有了切片。
举例说明数组的权限性:
func main() {a := [4]int{1, 2, 3, 4}println(arraySum(a))//b := [5]int{1, 2, 3, 4, 5}//println(arraySum(b)) //错误,函数只能接受[4]int 类型,其他的都不支持。所以传入长度为5 的数组的时候就会报错。
}func arraySum(x [4]int) int {sum := 0for _, v := range x {sum = sum + v}return sum
}
切片定义
var name []T
name是变量名称
T是表示切片中的元素类型
注意: nil相等于java中的null, 当你声明了一个变量 , 但却还并没有赋值时 , go 会自动给你的变量赋值一个默认零值。这是每种类型对应的默认值,基本类型有自己对应的默认值,复杂类型默认都是nil
func main() {// 声明切片类型var a []string //声明一个字符串切片var b = []int{} //声明一个整型切片并初始化var c = []bool{false, true} //声明一个布尔切片并初始化var d = []bool{false, true} //声明一个布尔切片并初始化fmt.Println(a) //[]fmt.Println(b) //[]fmt.Println(c) //[false true]fmt.Println(a == nil) //truefmt.Println(b == nil) //falsefmt.Println(c == nil) //falsefmt.Println(c == d) //报错,切片是引用类型,不支持直接比较,只能和nil 比较
}
切片的循环遍历
func main() {var a = []string{"北京", "上海", "深圳"}// 方法 1:for 循环遍历for i := 0; i < len(a); i++ {fmt.Println(a[i])}// 方法 2:for range 遍历for index, value := range a {fmt.Println(index, value)}
}
6、值类型和引用类型
值类型包括: 基本数据类型 int 系列, float 系列, bool, string 、数组和结构体struct。
引用类型: 指针、slice 切片、map、管道 chan、interface 等都是引用类型。
值类型概念:
变量直接存储值,内存通常在栈中分配。
引用类型概念:
变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC来回收。
7、运算符
7.1算术运算符
就是简单的加减乘除,下面是计算范例,这里就不用代码演示了
7.2关系运算符
7.3逻辑运算符
注意:
&&也叫短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为false。
||也叫短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为true。
7.4 赋值运算符
8、流程控制
8.1、if流程
代码演示
func main() {age := 30if age > 30 {fmt.Println("大于30")} else if age == 30 {fmt.Println("等于30")} else {fmt.Println("小于30")}
}
8.2、switch流程
9、函数和包
9.1函数
拥有一个返回值的函数
func main() {n1 := 1n2 := 2//计算n1+n2并返回值result := cal1(n1, n2)fmt.Println(result)
}func cal1(n1 int, n2 int) int {i := n1 + n2return i
}
拥有两个返回值的函数
func main() {n1 := 1n2 := 2/**计算n1+n2并返回值判断n1是否大于n2*/result, flag := cal2(n1, n2)fmt.Println(result, flag)
}func cal2(n1 int, n2 int) (int, bool) {i := n1 + n2return i, n1 > n2
}
有参数没返回值
func main() {cal("hello,函数")
}func cal(str string) {fmt.Println("cal函数被调用了", str)
}
没参数没返回值
func main() {cal3()
}func cal3() {fmt.Println("cal函数被调用了")
}
Go 语言快速开发入门(基础语法详解,第一节)相关推荐
- python编程语法大全-Python编程入门——基础语法详解
今天小编给大家带来Python编程入门--基础语法详解. 关于怎么快速学python,可以加下小编的python学习群:611+530+101,不管你是小白还是大牛,小编我都欢迎,不定期分享干货 每天 ...
- python编程语法-Python编程入门——基础语法详解
今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...
- python编程语法-Python编程入门——基础语法详解(经典)
今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...
- python基础编程语法-Python编程入门——基础语法详解
今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...
- python基础编程语法-Python编程入门——基础语法详解(经典)
今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...
- python编程if语法-Python编程入门基础语法详解经典
原标题:Python编程入门基础语法详解经典 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_number = ...
- python编程基础语法-Python编程入门基础语法详解
一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: 浮点 float_number = 2.3 复数 complex_number = ...
- c语言基础循环程序设计,C语言编程新手入门基础——循环详解!
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- 《微信小程序:开发入门及案例详解》—— 3.4 小结
本节书摘来自华章出版社<微信小程序:开发入门及案例详解>一 书中的第3章,第3.4节,作者李骏 边思,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3.4 小 ...
最新文章
- html制作状态栏数字时钟,用HTML5制作数字时钟的教程_html5教程技巧
- Python中常用的高阶函数
- C#封装WebBrowser时NewWindow事件无法获取Url的解决方法
- idea安装Maven Helper
- 雷军微博抽奖送蔚来汽车,中奖用户等9个月仍未兑现,蔚来官方回应...
- 超详细讲解,带你零基础入门 kafka!
- screenfetch 和 linux_logo安装使用
- spring管理bean容器(笔记)[继]
- 代码检查工具--findBugs
- 谷歌浏览器获取网页元素的xpath
- 想转行学IT,小白如何选择靠谱的培训学校
- 浏览器地址栏中文乱码问题
- IDEA Git 复制分支到新分支 提交到新分支
- Vue项目设置ico
- BEA助中国一汽构建核心ERP系统
- [笨木头FireFly 02]入门篇_客户端发送请求,服务器处理请求
- DNA甲基化在重头甲基转移酶远古丢失后数百万年的进化持久性
- 网络信息安全攻防实验室 脚本关第七关
- 营收同比增长12.8% 富途的增长故事为何难以吸引投资者?
- 如何做到网站seo秒收录?[经验分享]