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

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

Golang 基础之基础语法梳理 (一)的更多相关文章

  1. Golang 基础之基础语法梳理 (三)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第三章节 Golang 基础之基础语法梳理 (一) Gol ...

  2. Golang 基础之基础语法梳理 (二)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第二章节 Golang 基础之基础语法梳理 (一) Gol ...

  3. mySQL的安装和基础使用及语法教程

    mySQL的安装和基础使用及语法指南 一.MySQL的安装.配置及卸载 1.安装 2.配置 3.mySQL5.1的完全卸载 4.MYSQL环境变量的配置 二.MySQL控制台doc窗口的操作命令 1. ...

  4. Golang 笔记 1 基础、基本数据类型

    一.Go语言基础 1. 基础 Go语言中的标识符必须以字母(Unicode字母,PHP/JS可以用中文作为变量名)下划线开头.大写字母跟小写字母是不同的:Hello和hello是两个不同的名字.  G ...

  5. React实例入门教程(1)基础API,JSX语法--hello world

      前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发 ...

  6. 【原创】React实例入门教程(1)基础API,JSX语法--hello world

    前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发效率 ...

  7. HTML&CSS基础-CSS的语法

    HTML&CSS基础-CSS的语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.dome.html源代码 <!DOCTYPE html> <html ...

  8. JavaScript基础概念与语法

    学习了一些最基础的JavaScript语法: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  9. postgresql数据库学习-win平台下SQLshell基础操作及语法

    由于在学习https://www.bilibili.com/video/av24590479小马视频时, up主采用的linux虚拟机进行教学, 而本人采用window7进行操作,故在基础操作和语法上 ...

随机推荐

  1. JAVA面向对象特征详解

    1. 封装 封装性的产生目的:保护某些属性和方法不被外部所看见. 封装的实现:为属性和方法进行封装是通过关键字private声明的:实现该属性的set和get方法,为外部所访问 该公开的公开,该私有的 ...

  2. ubuntu中codeblocks设置代码黑色主题配色

    说明 网上资料较杂乱,特整理以备留用和他人参阅. 配置文件下载 首先下载配置文件,命名为default.conf. 配置文件 官方配置文件网址 将配置文件替换ubuntu如下路径内的default.c ...

  3. Spring Boot 2.x基础教程:使用tinylog记录日志

    tinylog简介 tinylog,与其他各种tiny开头的东西一样,是一个轻量级的开源日志解决方案.它本身只包含两个JAR文件(一个用于API,另一个用于实现),没有任何外部依赖关系.两个JAR文件 ...

  4. Solution -「CEOI 2017」「洛谷 P4654」Mousetrap

    \(\mathscr{Description}\)   Link.   在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...

  5. Solution -「POJ 3710」Christmas Game

    \(\mathcal{Decription}\)   Link.   定义一棵圣诞树: 是仙人掌. 不存在两个同一环上的点,度数均 \(\ge 3\).   给出 \(n\) 棵互不相关的圣诞树,双人 ...

  6. [LeetCode]35.搜索插入位置(Java)

    原题地址: search-insert-position 题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 请必须使 ...

  7. uniapp 微信发送订阅消息

    这篇主要针对小程序进行演示,既然是发送消息,那么就有三个问题.发送什么内容,给谁发送,怎么发送!往下一条一条解决. 发送什么消息内容 - 通过微信公众号平台 选择对应的消息模板 选择以后在我的模板里面 ...

  8. c++ StrVec等效vector(string)的类

    c++ StrVec等效vector<string>的类 知识点 静态成员变量要在类外定义和初始化 allocator类是使用和uninitialized_copy的配合使用,实现stri ...

  9. k8s核心资源:精简版yaml示例

    yaml语法及格式校验 详见:https://www.cnblogs.com/uncleyong/p/15437385.html 创建资源的三种方式 参考:https://www.cnblogs.co ...

  10. windev的Trigger触发器,能秒SQL吗?

    有朋友问,"你是不是在写论文?" (此处请想象个表情)"好吧,论文继续!" SQL中,触发器可以看成是一种特殊的存储过程,使用inserted临时表来建立数据关 ...