【go入门】go关键字

关键字

关键字是一门语言预定义的单词,作用是帮助编译器理解和解析源码。

如果查资料会说java有53个关键字,go只有25个关键字。go在标榜自己语法简单时,也经常拿这个说事。

但是,仔细看下会发现,java所说的53个关键字包括了11种基本类型和2个保留字。而go的25个关键字却是剔除了基本类型。所有具体来对比应该是40Vs25。

Java

关键字类别 关键字 关键字含义
访问控制 private 一种访问控制方式:私用模式,访问控制修饰符,可以应用于类、方法或字段(在类中声明的变量)
protected 一种访问控制方式:保护模式,可以应用于类、方法或字段(在类中声明的变量)的访问控制修饰符
public 一种访问控制方式:共用模式,可以应用于类、方法或字段(在类中声明的变量)的访问控制修饰符。
类、方法和变量修饰符 abstract 表明类或者成员方法具有抽象属性,用于修改类或方法
class 声明一个类,用来声明新的Java类
extends 表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口
final 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量
implements 表明一个类实现了给定的接口
interface 接口
native 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
new 用来创建新实例对象
static 表明具有静态属性
strictfp 精确浮点数运算。基本没用过。
synchronized 表明一段代码需要同步执行
transient 声明不用序列化的成员域
volatile 表明两个或者多个变量必须同步地发生变化
程序控制 break 提前跳出一个块
continue 回到一次循环的开始处
return 从成员方法中返回数据
do 用在do-while循环结构中
while 用在循环结构中
if 条件语句的判断
else 用在条件语句中,表明当条件不成立时的分支
for 循环
instanceof 用来测试一个对象是否是指定类型的实例对象
switch 分支语句结构的引导词
case 用在switch语句之中,表示其中的一个分支
default 默认,例如:用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现
错误处理 try 尝试一个可能抛出异常的程序块
catch 用在异常处理中,用来捕捉异常
throw 抛出一个异常
throws 声明在当前定义的成员方法中所有需要抛出的异常
包相关 import 表明要访问指定的类或包
package
变量引用 super 表明当前对象的父类型的引用或者父类型的构造方法
this 指向当前实例对象的引用,用于引用当前实例
void 声明当前成员方法没有返回值,void可以用作方法的返回类型,以指示该方法不返回值
保留字 goto 保留关键字,没有具体含义
const 保留关键字,没有具体含义,是一个类型修饰符,使用const声明的对象不能更新

Go

类别 关键字 含义
类、方法和变量修饰符 chan 定义一个channel
interface 定义接口
func 函数定义
map map结构类型
struct 定义结构体
type 定义类型
var 声明变量
const 声明常量
程序控制 break 提前跳出一个块
continue 回到一次循环的开始处
return 从方法中返回
if 条件语句的判断
else 用在条件语句中,表明当条件不成立时的分支
for 循环
switch 分支语句结构的引导词
case 用在switch语句之中,表示其中的一个分支
fallthrough 如果case带有fallthrough,程序会继续执行下一条case,不会再判断下一条case的值
default 默认选项,用在switch和select语句种
select go语言特有的channel选择结构
defer 延迟执行,函数的收尾工作。在函数结束前执行
go 并发
goto 跳转语句
range 从slice、map等结构中取元素
包相关 import 表明要访问指定的类或包
package

注意点

  1. go主要是去掉了的继承实现相关的关键字。

  2. 去掉了do-while结构,和for功能上重复。

  3. go语言中直接将将多线程的实现作为了关键字。也可见go的并发编程是他的杀手锏。

  4. go去掉了异常处理相关的。

几个陌生的关键字

go中有几个关键字还是比较陌生,先简单看下,以后也会专门写文章

go

go中的多线程编程称为goroutine,目前统一译为协程。

在go语言中进行多线程编程非常简单,只要用go关键字后面加上要执行的逻辑,那么这段代码就会以多线程的方式进行。

package main

import (
    "fmt"
    "time"
)

func main() {
    for i := 0; i < 10; i++ {
        // 启动协程
        go func(i int) {
            fmt.Println(i)
        }(i)
    }
    time.Sleep(2 * time.Second)
}
go run .\main.go
9
3
1
2
4
7
8
5
0
6

相比于java的Thread run,go的协程写起来确实简单很多。以后再进行详细对比。

chan

通道。和go协程一样,chan是go进行并发编程的另一个招牌。主要的作用是实现并发同步。大大的降低了并发编程的难度。

go语言的一个设计哲学是

不要通过共享内存来进行多线程通信,而是要通过通信来实现共享内存。

通道机制就是这种设计哲学的一个设计结果。

可以先简单的将通道看作一个先进先出的阻塞队列。

func Test_channel(t *testing.T) {
    // 创建一个容量为1的只可以放string类型数据的通道
    ch1 := make(chan string, 1)
    ch1 <- "a"
    // 通道已满,再放会阻塞
    // ch1 <- "b"
    t.Log("继续执行。。。")

    e1 := <-ch1
    t.Log("e1:", e1)

    // 通道已空,再取会阻塞
    e2 := <-ch1
    t.Log("e2:", e2)
}

这是一个单元测试函数。

make

在创建chan时用到了make函数,make()函数是go语言的一个内置函数。只用于channel,map和slice的创建。

select

select一般和chan一起使用,目的是为了选择某个通道。

func Test_channel4(t *testing.T) {
    // 创建三个通道
    intChannels := [3]chan int{
        make(chan int, 1),
        make(chan int, 1),
        make(chan int, 1),
    }

    // 随机选择一个发送
    index := rand.Intn(3)
    intChannels[index] <- index
    t.Logf("向channe%d发送", index)

    select {
    case e := <-intChannels[0]:
        t.Logf("0接收到:%d", e)
    case e := <-intChannels[1]:
        t.Logf("1接收到:%d", e)
    case e := <-intChannels[2]:
        t.Logf("2接收到:%d", e)
    default:
        t.Log("都没选中")
    }
}

定义一个chan数组,随机选择一个通道发送,一旦某个通道有数据了,select会自动选中。

defer

defer相比于前面几个,就很好理解了。

延迟执行,也就是在函数结束前执行,用于执行程序出现运行时错误时的兜底处理。

就是java的try-catch-finally

举个栗子

func main() {
    defer func() {
        fmt.Println("正常退出")
    }()
    fmt.Println("=======hello=======")
    defer func() {
        // 使用go内置函数recover恢复panic
        v := recover()
        fmt.Println("恐慌被恢复了:", v)
    }()
    panic("使用panic函数产生一个恐慌!")
    fmt.Println("执行不到这里")
}

执行结果

=======hello=======
恐慌被恢复了: 使用panic函数产生一个恐慌!
正常退出

panic()和recover()都是go语言的内建函数

panic()用于手动创建一个运行时错误。recover()专门用于恢复。

recover()必须用在defer延迟里。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 144,481评论 1 305
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 61,908评论 1 258
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 95,710评论 0 214
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 41,372评论 0 183
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 49,216评论 1 262
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,949评论 1 178
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,558评论 2 275
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,308评论 0 168
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 29,183评论 7 237
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,675评论 0 214
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,416评论 2 217
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,757评论 1 232
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,314评论 1 33
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,215评论 2 213
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,682评论 3 214
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,665评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,091评论 0 170
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,687评论 2 233
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,830评论 2 237

推荐阅读更多精彩内容

  • 关键字 & 保留字 关键字(或者保留字)是对编译器有特殊意义的固定单词,不能在程序中做其他目的使用。 关键字具有专...
    夜雨流云阅读 143评论 0 0
  • 一、GO简介 Go语言[https://go.dev/solutions](也叫 Golang)是Google开发...
    宏势阅读 2,678评论 0 2
  • title: go语言入门date: 2019-02-12 22:03:27 前言 因项目需要和个人喜好,决定系统...
    dounine阅读 308评论 0 3
  • 一. 符号 =与:=:= : 用来初始化一个不存在的变量, 包括声明和初始化2个步骤= : 赋值符号, 当变量被:...
    lj72808up阅读 230评论 0 0
  • 第10章处理错误 10.1 错误处理及Go语言的独特之处 在Go语言中,一种约定是在调用可能出现问题的方法或函数时...
    跑马溜溜的球阅读 374评论 0 1