大家好,明天将梳理出的 Go语言根底语法内容,分享给大家。 请多多指教,谢谢。
本次《Go语言根底语法内容》共分为三个章节,本文为第一章节
- Golang 根底之根底语法梳理 (一)
- Golang 根底之根底语法梳理 (二)
- Golang 根底之根底语法梳理 (三)
本章节内容
- Go关键字
- 示例Demo
- 申明、赋值
- 援用类型
- slice
- map
Go关键字
Go语言中共有25个关键字,根底语法章节中将为大家介绍全副关键字的应用。
break default func interface selectcase defer go map structchan else goto package switchconst fallthrough if range typecontinue for import return var
预约义名称列表
// 内建常量 true false iota nil// 内建类型 int int8 int16 int32 int64uint uint8 uint16 uint32 uint64 uintptrfloat32 float64 complex128 complex64bool byte rune string error// 内建函数make len cap new append copy close deletecomplex real imagpanic 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, intvar 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 []intx = 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"] = 18fmt.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可能随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址有效。
技术文章继续更新,请大家多多关注呀~~