共计 3623 个字符,预计需要花费 10 分钟才能阅读完成。
大家好,明天将梳理出的 Go 语言根底语法内容,分享给大家。请多多指教,谢谢。
本次《Go 语言根底语法内容》共分为三个章节,本文为第一章节
- Golang 根底之根底语法梳理 (一)
- Golang 根底之根底语法梳理 (二)
- Golang 根底之根底语法梳理 (三)
本章节内容
- Go 关键字
- 示例 Demo
- 申明、赋值
- 援用类型
- slice
- map
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
内建函数局部,将由后续章节介绍。
示例 Demo
在以上 Go 语言示例代码中,次要由三局部蕴含组成:
第一局部导入包名,默认为 main ;
第二局部导入规范库;
第三局部 main 函数定义,在 go 语言中,代码如果须要跑起来,代码必须要有 main 函数作为入口。
习惯上,Go 语言程序员举荐应用 驼峰式 命名,当名字由几个单词组成时优先应用大小写分隔,而不是优先用下划线分隔。
package
package 指归属于哪个包,go 语言中以目录构造叫做包。如果代码中有 main()函数,以后 package 包必须是 main 包。
package main
import
导入规范库或第三方库
import "fmt" // 反对单个
import ( // 反对多个
"log"
alias "other/xxxx" // 反对库设置别名
_ "other/xxxs" // 反对库默认加载库
)
申明、赋值
Go 语言次要有四种类型的申明语句:var、const、type 和 func,别离对应变量、常量、类型和函数实体对象的申明。
在应用多重赋值时,如果想要疏忽某个值,能够应用 匿名变量(anonymous variable)
匿名变量用一个下划线 _
示意。
匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在反复申明。
var
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"} // 并初始化值
const
常量表达式的值在编译期计算,而不是在运行期。每种常量的潜在类型都是根底类型:boolean、string 或数字。常量的值不可批改,这样能够避免在运行期被意外或歹意的批改。
// 申明
const num = 10
type
新命名的类型,用来宰割不同概念的类型,这样即便它们底层类型雷同也不是兼容的
// type 类型名字 底层类型
type Num float64
类型申明语句个别呈现在包一级,因而如果新创建的类型名字的首字符大写,则在包内部也能够应用。
func
函数申明包含函数名、形式参数列表、返回值列表(可省略)以及函数体。
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
- map
- channel
slice
介绍
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)
map
介绍
哈希表是一种奇妙并且实用的数据结构。它是一个无序的 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 可能随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址有效。
技术文章继续更新,请大家多多关注呀~~