大家好,今天将梳理出的 Go语言基础语法内容,分享给大家。 请多多指教,谢谢。
本次《Go语言基础语法内容》共分为三个章节,本文为第一章节
Go语言中共有25个关键字,基础语法章节中将为大家介绍全部关键字的使用。
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
预定义名称列表
// 内建常量
true false iota nil
// 内建类型
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
// 内建函数
make len cap new append copy close delete
complex real imag
panic recover
内建函数部分,将由后续章节介绍。
在以上Go语言示例代码中,主要由三部分包含组成:
第一部分导入包名,默认为 main ;
第二部分导入标准库;
第三部分 main函数定义,在go语言中,代码如果需要跑起来,代码必须要有main函数作为入口。
习惯上,Go语言程序员推荐使用 驼峰式 命名,当名字由几个单词组成时优先使用大小写分隔,而不是优先用下划线分隔。
package指归属于哪个包,go语言中以目录结构叫做包。 如果代码中有main()函数,当前package包必须是 main包。
package main
导入标准库或第三方库
import "fmt" // 支持单个
import ( // 支持多个
"log"
alias "other/xxxx" // 支持库设置别名
_ "other/xxxs" // 支持库默认加载库
)
Go语言主要有四种类型的声明语句:var、const、type 和 func,分别对应变量、常量、类型和函数实体对象的声明。
在使用多重赋值时,如果想要忽略某个值,可以使用 匿名变量(anonymous variable)
匿名变量用一个下划线 _
表示。
匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。
var声明语句可以创建一个特定类型的变量,然后给变量附加一个名字,并且设置变量的初始值。
变量声明的一般语法:
// var 变量名字 类型 = 表达式
var name string = "帽儿山的枪手"
数值类型变量对应的零值是0,布尔类型变量对应的零值是false,字符串类型对应的零值是空字符串,接口或引用类型(包括slice、指针、map、chan和函数)变量对应的零值是nil
也可以在一个声明语句中同时声明一组变量,或用一组初始化表达式声明并初始化一组变量。
var i, j, k int // int, int, int
var b, f, s = true, 2.3, "four" // bool, float64, string
一组变量也可以通过调用一个函数,由函数返回的多个返回值初始化
var f, err = os.Open(name) // os.Open returns a file and an error
Go 语言中变量的声明必须使用空格隔开
var age int
定义字符串数组语法
var strArrar1 []string // 声明类型为string数组
var strArrar2 []string{"a", "b"} // 并初始化值
常量表达式的值在编译期计算,而不是在运行期。每种常量的潜在类型都是基础类型:boolean、string或数字。常量的值不可修改,这样可以防止在运行期被意外或恶意的修改。
// 声明
const num = 10
新命名的类型,用来分割不同概念的类型,这样即使它们底层类型相同也不是兼容的
// type 类型名字 底层类型
type Num float64
类型声明语句一般出现在包一级,因此如果新创建的类型名字的首字符大写,则在包外部也可以使用。
函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。
func name(param) (result) {
// body
}
函数传参,返回值 float64类型
func hypot(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
defer用法
defer
延迟调用, 一般用在函数中最后执行
func example() {
defer func() {
fmt.Println("最后执行")
}
fmt.Println("首先执行")
}
Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。
数组和slice之间有着紧密的联系。一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象。一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素并不一定就是数组的第一个元素。长度对应slice中元素的数目;长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。内置的len和cap函数分别返回slice的长度和容量。
多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠。
slice值包含指向第一个slice元素的指针,因此向函数传递slice将允许在函数内部修改底层数组的元素。换句话说,复制一个slice只是对底层的数组创建了一个新的slice别名。
和数组不同的是,slice之间不能比较,因此我们不能使用==操作符来判断两个slice是否含有全部相等元素。
一个零值的slice等于nil。一个nil值的slice并没有底层数组。一个nil值的slice的长度和容量都是0,但是也有非nil值的slice的长度和容量也是0的,例如[]int{}或make([]int, 3)[3:]。与任意类型的nil值一样,我们可以用[]int(nil)类型转换表达式来生成一个对应类型slice的nil值。
使用内建make函数创建一个指定元素类型、长度和容量的slice。容量部分可以省略,在这种情况下,容量将等于长度。
make([]T, len) // 省略容量
make([]T, len, cap) // 容量
使用内建append函数可以追加多个元素,甚至追加一个slice
var x []int
x = append(x, 1)
x = append(x, 2, 3)
x = append(x, 4, 5, 6)
哈希表是一种巧妙并且实用的数据结构。 它是一个无序的key/value键值对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。
在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。map中所有的key都有相同的类型,所有的value也有着相同的类型,但是key和value之间可以是不同的数据类型。其中K对应的key必须是支持==比较运算符的数据类型,所以map可以通过测试key是否相等来判断是否已经存在。
map类型的零值是nil, 也就是没有引用任何哈希表。
使用内建make函数创建一个map
ages := make(map[string]int)
可以用map字面值的语法创建map,同时还赋值key/value
ages := map[string]int{"age1": 18, "age2": 19}
另一种创建空的Map表达式
ages := map[string]int{}
Map中元素通过key下标语法访问
ages["age1"] = 18
fmt.Println(ages["age1"])
使用内建delete函数可以删除元素
delete(ages, "age1") // 即使某些元素不在map中也没有关系,失败时将返回0。
遍历map中全部的key/value对的话,可以使用range风格的for循环实现
for name, age := range ages {
fmt.Printf("%s\t%d\n", name, age)
}
禁止对map元素取地址,是因为map可能随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址无效。
技术文章持续更新,请大家多多关注呀~~
手机扫一扫
移动阅读更方便
你可能感兴趣的文章