Skip to content
kcp edited this page Nov 21, 2020 · 4 revisions

title: Go基础 date: 2018-12-14 09:25:49 tags: - 函数式编程 categories: - Go

目录 start

  1. Go
    1. Modules
      1. 配置
    2. 数据类型
      1. string
      2. int
      3. Array
      4. Slice
      5. Map
      6. Set
    3. 基本语法
      1. 标准输入输出
      2. 时间处理
    4. 函数
      1. 参数
      2. 返回值
      3. defer
    5. 接口
    6. Channel
    7. 文件操作
    8. Test
    9. JSON
  2. Tips
    1. 通过字符串调用指定函数

目录 end|2020-11-04 20:24|


Go

官网 | 镜像官网 | Github Repo | Go Doc

Rethinking Visual Programming with Go

Goplus

project-layout项目结构规范

Modules

1.11 开始支持 Wiki

配置

  • go env -w GOSUMDB=off 关闭官方 sum 校验服务

配置国内源

export GO111MODULE=on
export GOPROXY=https://mirrors.aliyun.com/goproxy/
export GOSUMDB=sum.golang.google.cn

wiki Modules
参考: Go模块简明教程


  1. go mod init moduleName 按名字初始化模块

    1. 注意,如果想通过 go get URL方式进行安装,就必须使用代码托管的完整地址, 不需要就可以简化包名
    • 例如 module github.com/{username}/{repo}/path/to
  2. go mod edit -replace github.com/kuangcp/gobase/cuibase=./../cuibase

    • go.mod文件会新增: replace github.com/kuangcp/gobase/cuibase => ./../cuibase
    • 多模块开发时,使用本地开发的模块取代发布的版本
    • fork 别人项目后开发,可用来替换成自己的模块 replace gihub.com/aaa/bbb => gihub.com/ccc/bbb
  3. go clean -modcache

go mod graph 列出模块依赖(包含依赖传递)
go mod tidy 删除错误或者不使用的modules
go mod vendor 生成vendor目录
go mod verify 验证依赖是否正确
go mod why 查找依赖

go get

go get golang.org/x/text@latest 拉取最新的版本(优先择取 tag)
go get golang.org/x/text@master 拉取 master 分支的最新 commit
go get golang.org/x/[email protected] 拉取 指定 tag
go get golang.org/x/text@342b2e 拉取 指定 commit
go get github.com/smartwalle/alipay/v3 拉取v3版本 设计最坑
go get -u 更新 mod
go list -m -versions golang.org/x/text 列出可安装版本

数据类型

类型后置的设计相关文章

螺旋形(C/C++)和顺序(Go)的声明语法
Why do a lot of programming languages put the type after the variable name?

string

strings 包 提供了常用字符串API

int

int8 int16 int32 int64 int(位数按操作系统字长而定 32/64)

    // string到int
    int,err:=strconv.Atoi(string)
    // string到int64
    int64, err := strconv.ParseInt(string, 10, 64)
    // int到string
    string:=strconv.Itoa(int)
    // int64到string
    string:=strconv.FormatInt(int64,10)

Array

Slice

Map

    // 判断 key 存在
    _, ok := dataMap["key"]

Set


基本语法

标准输入输出

参考: golang中的格式化输入输出

  • 打印结构体 fmt.Printf("%v\n", object)

时间处理

Go: Format a time or date

记住这个神奇的时间 2006-01-02 03:04:05 Go 中不是寻常的 YYYY-mm-dd 这种格式


函数

基本结构

// 函数名 (参数 ) 返回值{函数体}
func functionName (param int) int {

}

参数

使用函数作为参数 func doAny(functionName func(string, string)){}

返回值

可以多返回值 元组

defer

类似于 Java 中的 finally 语句 例如 defer openFile.Close()

一个函数中可以定义多个 defer 语句, 执行顺序按定义顺序的逆序, 也就是栈的概念


接口

参考:接口的定义和使用


Channel

参考 如何优雅地关闭Go channel Go Channel 详解


文件操作

递归读取当前目录的文件

package main
import (
    "fmt"
    "os"
    "path/filepath"
)
func main() {
    filepath.Walk("./", walkfunc)
}
func walkfunc(path string, info os.FileInfo, err error) error {
	if(!info.IsDir()){
		fmt.Println(path)
	}
    return nil
}

statik 将文件打包入二进制执行文件中去


Test

Github: assert


JSON

结构体必须是大写字母开头的成员才会被处理(大写字母开头才有对外权限)

参考: Go操作JSON 参考: go and json 参考: 在Go语言中使用JSON

website: json to go struct

	type GridConfig struct {
        ID   int   `json:"id"`
        Row  int   `json:"row"`
        Col  int   `json:"col"`
        Data []int `json:"data"`
    }

// 第一种
func (*GenerateGrid) ReadConfig() []GridConfig {
	var datas []GridConfig
	fp, _ := os.Open("grid.json")
	dec := json.NewDecoder(fp)
	for {
		err := dec.Decode(&datas)
		if err != nil {
			fmt.Println(err)
			break
		}
		//use v
		// fmt.Printf("%+v", datas)
		for _, line := range datas {
			fmt.Println(" ", line)
		}
	}

    // 第二种方式
	var datas []GridConfig
	raw, err := ioutil.ReadFile("./grid.json")
	// fmt.Println(raw)
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(1)
	}
	err = json.Unmarshal(raw, &datas)
	if err != nil {
		fmt.Println("error:", err)

	}
	for _, line := range datas {
		fmt.Println(" ", line)
	}

	return datas
}

忽略空字段

  1. 字段是指针类型 且注明 omitempty
Msg struct{
 Text     *Content `json:"text,omitempty"`
}

Tips

lorca H5 + chromium + Golang桌面端

通过字符串调用指定函数

参考: Go 根据字符串调用指定函数 参考: WebAssembly 和 Go语言:对未来的观望

Summary

Clone this wiki locally