您的位置:首页 > 编程语言 > Go语言

Go学习笔记

2015-08-20 17:12 417 查看
Go语言
特性
赞美之词

Chapter1
tips

Chatper2 基本语法
特殊保留关键字

tips

变量申请

built-in types

流程控制
if

for

break goto 都可支持标签

switch

fallthrough

func函数定义

defer 延迟

panic recover try catch

import操作

struct 自定义类型

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
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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  go