Go学习笔记

MarvinHe · · 1925 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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:

  1. fmt.Printf 不会自动换行;
  2. 而python的 print 会自动换行;
  3. _, b = 34, 35 ; # 赋值给 “_” 的变量会被丢弃
  4. 未使用的变量,会编译错误(好强制);
  5. int32 与 int 64 不可加减(无cast);
  6. 支持复数: var c complex64 = 5 + 5i;
  7. 字符串反引号 “ 括起来 为 raw_string, 不进行转义;
  8. iota 每次赋值时,重置为0;
  9. 数组定长;
  10. 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:

  1. bool: true, false
  2. int, uint; 以及各种定长 int32, int64; (各种int之间不可加减)
  3. string: 双引号”“, 反引号“ 括起来;(无单引号) immutable;
    改变字符串,必须变为 byte 数组,修改后,再 new_str = string(btye_array)
  4. error: 错误类型
  5. array: var arr [n]type;
  6. slice: 动态数组; var arr []type;
  7. 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
}

版权声明:本文为博主原创文章,未经博主允许不得转载。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:MarvinHe

查看原文:Go学习笔记

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1925 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传