[笔记]go语言基础语法

image

0.基本语法结构

package main
import "fmt"
func main(){
  fmt.Println("Hello World")
}
- 声明包
- 保留了大括号,但去掉了分号
- 和python有点像,但没有强制锁进
- 首字母大写表示public,小写表示private
- 和类c语言相似,都是从main函数开始执行

1、 变量

变量的声明和初始化

go语言的变量声明需要使用var一下,或者使用海象运算符

var x int =1 //长声明
var y,z int =1024,2048 //多重声明
p:=3 //海象运算符,短声明
//如果没有初始化,用默认值代替
const Pi=3.14 //常量,变量不可更改。声明常量需要关键字const,禁止使用海象运算符

变量类型

go是强类型语言,对于数值类型的定义域和符号分的很清,除了所有语言都有的数字类型、字符串、数组外,还有一些go独有的派生类型。

整数类型:int,int8,int32,int64,带符号和不带符号

浮点类型:Float32—单精度浮点值,Float64—双精度浮点值

布尔类型:true,false

字符串类型:string

数组类型:array

指针类型:pointer
管道类型:chan

接口类型:interface

常量

const PI =3.1415926

2 、运算符

//算术运算符
x,y :=1,2
res:=x+y //加法
res:=x-y //减法
res:=x/y //除法,取整
res:=x%y //模,取余数
res+=x //赋值运算符,类似的*=,%=

//关系运算符
res:=x==y
res:=x!=y
res:=x>y
res:=x<y

//逻辑运算符
res:=x>0&&y>=0 //与门
res:=x>0||y>0 //或门
res:=!(x>y)//非门

3、 逻辑结构

判断

//判断语句
x:=1
if x>0{
  //... ...
}else{
  //... ...
}

循环


//for循环
for x:=1;x<10;x++{
  //...
}
// 省略初始化和迭代loop
x:=1
for x<10{
  //...
  x++
}

switch

//switch,注意go中没有break语句,遇到第一个匹配的case就会跳出判断,不会穿透
x:=1
switch x{
  case 1:
    //...
  case 2:
    //...
  case 3:
    //...
  default:
    //...
}

4、函数

函数结构

关键字、函数名、函数体、输入参数,返回值

//基本结构,关键字、函数名、函数体、形参、返回值
func FunName(v int) string{
  return st
}
//多个参数的输入和输出
func FunName(v1 int ,v2 int)(int,string){
  return 2,"2"
}

可变参数

// 例子:求n个整数的和
func sum(x ...int) (s int) {
    //可变参数
    for _, v := range x {
        s += v
    }
    return
}
// 也可以直接把切片扔进去作为可变参数
arr=[3]int{1,2,3}
sum(arr...) //类似于解包的操作

闭包于匿名函数

闭包给了在内部函数捕获外部函数参数的权利,匿名函数是闭包的实现方式之一,字面意思上的没有名字,直接调用的函数。

// 函数的闭包
func test14(a int, b int) int {
    func() {
        fmt.Println(a, b)
    }()
    return a + b
}

5、指针

指针,即一个值的内存地址。在go中,&表示取地址,*表示取值。

指针声明

var p1 *int
var p2 *string
// go中指针必须带类型

6、结构体

定义数据使用,类似于其他面向对象语言中的class

type Contact struct{
  Age int
  Name string
}

结构体与指针

x:=&Contact{"ronron",12}
x.name="xiaojiji"

7、方法

结构体除了声明了属性外,还能定义方法,方法即带接收器的函数。

type Contact struct{
  Name string
  Age int
}
// 方法,结构体接收器
func (c Constact) addAge1(){
  c.Age+=1 
}
// 方法,结构体指针接收器
func (c *Contact) addAge2(){
  c.Age+=1 
}


与普通函数相比,方法多了一个接收器,这个接收器可以是结构体,也可以是结构体指针。如果是结构体,那么传递的是结构体副本,修改不会影响原有的对象。如果是结构体指针,那么会影响原有的对象。

8、数组 Array

var a [3]int //定义一个长度为3的空数组
var a [3]int{1,2,3} //定义一个长度为3的数组并初始化
//数组的操作
// 索引
a[1]

数组一旦定义就无法修改大小,不方便使用,所以常用切片 slice代替

//切片定义方式一,直接从数组中切下来
a :=[5]int{1,2,3,4,5}
b:=a[1,3]

//切片定义方式二 ,使用make方法
c:=make([]int,5,10) //注意初始化长度为5,元素默认为0

//切片的遍历,和python真的相似
    for i := 0; i < len(a); i++ {
        fmt.Println(a[i])
    }
    for _, v := range a {
        fmt.Println(v)
    }

切片

go语言中的数组一旦定义就不能再改变长度,不大好用。切片是数组的高一级别的抽象,可以理解为动态数组。


// 定义一个字符串的切片,初始长度为10,容量为20
s:=make([]string 10,20)

// 切片的索引,与python相似
s[1:3]

// 

9、字典Map

//直接定义和初始化map
m := map[string]int{
        "a": 1,
        "b": 2,
    }

// 使用make进行初始化
m :=make(map[string]int)

// 添加元素
m["c"]=1024

//获取value
value,ok:=m["c"]
value,ok:=m["d"]
if ok{
  
}else{
  
}

//遍历map
for k, v := range m {
        fmt.Println(k, v)
}

//删除dict元素
delete(m,"a")

10、并发

并发是go语言提供的核心语法,相比其他语言多线程的方式,使用简单,效率更高,管理便捷。

go例程中最核心的概念是goroutine和chan

goroutine

// 任务1
func A(){
  //do some thing a
}
//任务2
func B(){
  // do some thing b
}
//关键字go 直接使用例程,类似于其他语言中开辟一个新的线程
func main(){
  go A() //处理任务A
  go B() //处理任务B
}

channel

Channel用于多个goroutine 之间进行通信,<-符合指示数据的流动方向

// 创建一个channel
ch:=make(chan int)
// 向chan中发射数据
ch <- 1
// 从chan中接受一个数据
value := <-chan
// 不用变量接收也可以
<- chan

11 错误处理

go中没有exception的概念,取而代之的是error,error在go中是一个接口

type error interface {
    Error() string //只要实现了这个方法,就算error
}

go中把‘异常’当中一个值来处理,所以并没有try catch的语法,而是通过判断error是否为nill来进行异常处理。


// 内部error的处理
func ErrorTest(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("b can not be zero")
    }
    return a / b, nil
}
// 调用
v,error:=ErrorTest(1,0)
if error !=nill{
  // 处理有错误的情况
  return
}
//...正常的处理

Panic和recove

panic用于手动抛出致命异常,直接宕机,程序线程停止。

recover 获取宕机时的信息,配合defer关键字,让程序在宕机后能继续从断点处开始运行。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容