大家好,明天将梳理出的 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可能随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址有效。

技术文章继续更新,请大家多多关注呀~~