Go语言
特性:
极简语法,原生多线程支持;
赞美之词:
解释性的灵活,动态类型语言的效率,静态类型的安全性;
Chapter1:
GOPATH 为 go语言的工作目录;
* 基本文件——$GOPATH/src, pkg, bin
* go build :编译,若有main package 生成目录名相同的可执行文件
* go install 生成package
* go fmt 可自动格式化代码风格;
tips:
- array_linux.go array_darwin.go build 换选与当前系统环境相同的编译;
Chatper2 ——基本语法
go 默认utf-8编码;
特殊保留关键字:
chan, defer, fallthrough, map, range, select,
tips:
- fmt.Printf 不会自动换行;
- 而python的 print 会自动换行;
- _, b = 34, 35 ; # 赋值给 “_” 的变量会被丢弃
- 未使用的变量,会编译错误(好强制);
- int32 与 int 64 不可加减(无cast);
- 支持复数: var c complex64 = 5 + 5i;
- 字符串反引号 “ 括起来 为 raw_string, 不进行转义;
- iota 每次赋值时,重置为0;
- 数组定长;
- slice 有个 cap 概念;当cap为0后,slice.append() 会开辟新的内存;
变量申请
var var1 type
var default_var1, default_var2 type = '1', '2'
var notype_var1, notype_var2 = '1', '2'
simple_var1, simple_var2 := '1', '2'
var variable type; 变量申明在最后;
提供默认值的时候可以不申明 type;
甚至不提供关键词 var
var1, var2 := ‘1’, ‘2’
“:=” 赋值符号,相当于定义了这个变量;但仅针对局部变量;
全局变量必须用 var 显式申明;
var 变量;
const 常量;
built-in types:
- bool: true, false
- int, uint; 以及各种定长 int32, int64; (各种int之间不可加减)
- string: 双引号”“, 反引号“ 括起来;(无单引号) immutable;
改变字符串,必须变为 byte 数组,修改后,再 new_str = string(btye_array) - error: 错误类型
- array: var arr [n]type;
- slice: 动态数组; var arr []type;
- map: 即 python dict; rating := map[string]float32 {“C”: 4.5, “GO”: 5}
go语言的内存分配——每个数据类型 一块 独立的区域;(因此不同Int之间无法赋值)
iota 枚举值
const (
x = iota
y = iota
z = iota
w
)
# x:0, y:1, z:2, w:3
const t = iota # 此时iota重置为0, t:0
convention:
大写字母开头的为 Public; 如 Sqrt
小写字母开头的为 Private; 如 calculate
流程控制:
if:
条件式左右 无 括号 ()
条件是可 申明变量(局部变量,仅if语句块内生效)
for
for i=0; i < 1000; i++ {
}
for ; sum < 1000; {
sum += 10
}
可简写为:
for sum < 1000; {
sum += 10
}
# 其实就是 while(囧)
break, goto 都可支持标签;
switch
每个 case 默认添加 break操作(终于不用写那么多 break 了)
fallthrough
强制 switch case 匹配后 继续执行,不自动break;
func函数定义
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
return value1, value2
}
感想:囧!为啥把返回值放到 参数后面去了;
给返回值命名,最大的好处是 func 内可见,可直接return;
defer (延迟)
在函数结束后,逆序执行;(先进后出)
常用于资源关闭;
panic + recover = try catch;
每个 package 建议有一个 init 函数(正如python package 中的 init.py 作用一样)
main 函数仅在 main package里有;
import操作:
import (
f "fmt"
. "net/http"
_ "github.com/ziutek/mymysql/godrv"
)
# f 此时为 fmt 的别名; . 为当前目录的意思,http包里函数可以直接使用;
# 同python 中 from net.http import *
# _ 不引入变量,仅执行 init 函数;
struct 自定义类型;
type Human struct {
name string
age int
weight int
}
type Student struct {
Human
speciality string
}
匿名定义就相当于其他语言的继承; Student默认包含Human的所有字段;
# method 只需要在函数前面增加一个 receiver 即可;
func (c Circle) area() float64 {
return c.radius * c.radius * math.Pi
}