golang基本用法速查

Hello World!

package main

import "fmt"

func main() {
   fmt.Println("Hello World!") 
}

引入模块

引入内置模块

//单个引入
import "fmt"

//引入多少个
import (
    "fmt"
    "os"
)

引入第三方模块

  • 规则: 默认从 GOPATH 下 src 目录开始找
  • import 的路径到目录终止, 不会到文件, 每个目录就是一个模块, 一般最终目录名即模块名
  • 默认的模块名由 go 文件首行 package 定义, 多个 go 文件的 package 可以相同, 同一模块的 go 文件应该放置于同一个目录
  • 模块可以使用别名
  • 通过 govendor 可以方便进行项目迁移
import (
    "github.com/wildsre/arc/arc"
    arcModel "github.com/wildsre/arc/model"
    "github.com/wildsre/arc/router"
)

变量初始化

基本变量初始化

    var x int
    var (
        i int
        j float64
        k, z string
    )
    v := "test"

数组&切片初始化

初始化后, 长度和容量都相等, 数组初始化完后就已经分配所有长度的内存, 切片在使用append扩容后, cap会与len不等

    //初始化定长数组
    arr := [3]int{1,23} //len: 3, cap: 3 
    s := []int{1,3}     //len:2, cap:2
    //初始化定长切片
    slice := make([]int, 3)

映射初始化

  • 常规初始化
    //方式1: 先声明, 后赋值, 声明后m为nil指针
    var m map[string]string
    m = make(map[string]string)
    m["k1"] = "v1"
    //方式2
    m2 := map[string]string{"k1":"v1", "k2":"v2"}
  • 嵌套映射初始化
    m2 := map[string][]int{"k1":{1,2}, "k2":{1,1}}
    m3 := map[string]map[string]string{"k1":{"k11":"v1"}}

结构体初始化

    //匿名结构体
    s1 := struct {
        Att1 string
        Att2 int
    }{"a", 1}

    //先定义再初始化
    type Foo struct {
        A1 string
        A2 []int
    }

    //初始化需要注意, 前后括行不能为空 
    // Foo:{
    //    "a", 
    //    []int{1,2} 
    // } 会报错
    s2 := Foo{ "a",
        []int{1,3} }

    //初始化部分变量
    s3 := Foo{ A1: "s" }

控制语句

循环

    for i:=0; i<2; i++ {
        fmt.Println(i)
    }

判断

    if i<0 {
        fmt.Println("one")
    } else if i>=0 && i<3 {
        fmt.Println("two")
    } else {
        fmt.Println("three")
    }

数据类型转换

string 和 bytes

    s1 := "test 测试"
    //string to bytes
    b1 := []byte(s1)

    //bytes to string
    s2 := string(b1)

string 和 数字

    import "strconv"
    s1 := "2001"
    //string to int
    i1, e := strconv.Atoi(s1)
    
    //int to string
    s2 := strconv.Itoa(i1)

    s3 := "3.1415"
    //string to float
    f1, e := strconv.ParseFloat(s3, 64)

    //float to string
    s4 := fmt.Sprintf("%.3f", f1)

json 的处理

import "encoding/json"

type UserData struct {
    UserName string `json:"username"`
    Token string `json:"token"`
    DefaultSpace string `json:"default-space"`
    Space map[string]string `json:"space"`
}

txt := `{
    "username":"foo", 
    "token": "a123", 
    "default-space": "foo", 
    "space": {"foo":"bar"}
}`
ud := new(UserData)

//json字符串转对象, 参数2需要为指针
e := json.Unmarshal([]byte(txt), ud)

//对象转json字符串
txt2, e := json.Marshal(ud)

时间-日期处理

    import "time"

    //获取当前时间, Time结构体
    now := time.Now()

    //格式化时间, layout只能为固定格式
    fnow := now.Format("2006-01-02 15:04:05.000")
    fmt.Println(fnow)

    //时间戳(秒,纳秒)
    fmt.Println(now.Unix())
    fmt.Println(now.UnixNano())

    //解析时间字符串, 时区?
    last, e := time.Parse("2006-01-02T15:04:05.000", "2020-02-29T15:33:40.312")
    fmt.Println(last, e)

    //时间运算: 5分钟前(毫秒到小时: ms, s, m, h)
    d5, _ := time.ParseDuration("-5h")
    last5 := last.Add(d5)
    fmt.Println(last, last5)

    //时间运算: 两时间差
    d2 := now.Sub(last)
    fmt.Println(d2.String())
//时间格式
const (
    ANSIC       = "Mon Jan _2 15:04:05 2006"
    UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
    RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
    RFC822      = "02 Jan 06 15:04 MST"
    RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
    RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
    RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
    RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
    RFC3339     = "2006-01-02T15:04:05Z07:00"
    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
    Kitchen     = "3:04PM"
    // Handy time stamps.
    Stamp      = "Jan _2 15:04:05"
    StampMilli = "Jan _2 15:04:05.000"
    StampMicro = "Jan _2 15:04:05.000000"
    StampNano  = "Jan _2 15:04:05.000000000"
)

文件读写

https://www.jianshu.com/p/7790ca1bc8f6

import (
    "os"
    "ioutil"
)

读文件

const (
        // Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
        O_RDONLY int = syscall.O_RDONLY // open the file read-only.
        O_WRONLY int = syscall.O_WRONLY // open the file write-only.
        O_RDWR   int = syscall.O_RDWR   // open the file read-write.
        O_APPEND int = syscall.O_APPEND // append data to the file when writing.
        O_CREATE int = syscall.O_CREAT  // create a new file if none exists.
        ...
)
//               文件名      模式                               权限
f := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)

//f.Read([]byte), Read方法读取指定长度的字节, 一般我们会读取被打开文件的所有内容
//使用 ioutil.ReadAll 获取全部内容
//使用 ReadAll 接口要求参数 f 需要有 Read(b []byte) (n int, err error) 接口
txt, err := ioutil.ReadAll(f)

//只读取文件
txt, err := ioutil.ReadFile("test.txt")

写文件

f.Write([]byte("hello."))

压缩-解压gzip文件例子

import (
    "os"
    "io/ioutil"
    "compress/gzip"
)
//使用gzip压缩二进制文件
srcBin, err := ioutil.ReadFile("test.bin")
dstGz, err := os.OpenFile("test.gz", os.O_CREATE|os.O_WRONLY, 0644)
gzHandle := gzip.NewWriter(dstGz)
gzHandle.Write(srcBin)
//解压gzip文件
srcGz, err := os.Open("test.gz")
dstBin, err := os.Open("test.bin", os.O_CREATE|os.O_WRONLY, 0755)
gzHandle, err := gzip.NewReader(srcGz)
content, err := ioutil.ReadAll(gzHandle)
dstBin.Write(content)

函数

协程

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

推荐阅读更多精彩内容