(CSDN使用新的编辑器了!但是还是没有Golang语言啊,掀桌)
环境:Sublime3 语言:Go
总起:
个人主要接触是C系列的语言为主(像是C++、Java、C#),所以习惯上这类语言编写的时候非常轻松。
当时在写lua的时候记录过一些lua特别(奇葩?)的地方,作为给自己的一些提醒,不过当时也没写成博客,下次写lua的时候再整理一下。
刚学完无闻的教程,先来整理一下Golang语法上一些特殊的地方,可能不是很完整,主要留作编写代码时的查阅。
特殊之处:
♦ 变量的申明和初始化
// 基本变量初始化的三种方式
var str1 string = "你好"
var str2 = "Hello"
str3 := "こんにちは"
// 数组初始化的三种方式
var arr1 [3]int
arr2 := [3]int{1, 2, 3}
arr3 := [...]int{1, 2, 3, 4, 5}
// 指针的使用
p1 := &arr1
p2 := new([10]int)
// 注: 在golang中直接在函数中传递一般都为值传递,
// 需要引用传递必须使用指针的方式
// slice的初始化 一种go独有的高级指针
var slice1 []int
slice2 := arr1[1:]
slice3 := make([]int, 3, 6)
// 注: slice用当前容量和最大容量的概念,
// 例中的slice3当前容量为3,最大容量为6,
// 分别使用len(slice3)和cap(slice3)取得。
// 操作方式有append(slice3, ... )添加,copy(tar,sou)拷贝
// map的初始化
var m1 map[int]string = make(map[int]string)
m2 := make(map[int]string)
// 匿名函数
fun1 := func() {}
// chan WaitGroup
chan1 := make(chan bool)
wg := sync.WaitGroup{}
♦ 条件语句
i := 1
// if的两种形式
if i > 0 { }
if i := 0; i == 0 { }
// for的四种形式
for { break }
for i == 0 { }
for i := 0; i < 1; i++ { }
for k, v := range m1 { fmt.Println(k, v) }
// switch
switch i {
case 1:
case 2:
}
switch i := 1; {
case i == 1:
case i == 2:
}
// 注: go中的switch有很多不同之处,
// case判断成功后,只会执行当前语句块,想要继续判断使用fallthrough,
// switch中可以执行类似第二种的条件检测
♦ struct
type Person interface {
Name() string
}
type Teacher struct {
name string
class int
}
func (t Teacher) Name() string {
return t.name
}
func (t *Teacher) ChangeClass(other int) {
t.class = other
}
func (t *Teacher) AddStudents(stus ...int) {
}
♦ 类型转换
// 类型转换
str4 := string(65) // 得到A
str5 := strconv.Itoa(65)
t := &Teacher{"老王", 3}
t.ChangeClass(4)
// 接口转类
var p Person = t
if tTmp, ok := p.(*Teacher); ok {
fmt.Println(tTmp.Name())
}
switch p.(type) {
case *Teacher:
}
♦ 异常与恢复
// 异常与恢复
defer func() {}()
// 注: defer相当于finally,
// 但他是函数执行完或抛异常后,从后往前执行
defer func() {
// recover恢复程序,继续执行
if err := recover(); err != nil {
fmt.Println(err)
}
}()
panic("Painc") // 抛异常
个人:
学习的时候,前面的基本没什么问题,到并发那块就有点懵逼了,而Golang最精华的所在的就是并发吧,等下次仔细研究一下。