共计 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 可能随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址有效。
技术文章继续更新,请大家多多关注呀~~