GO语言基础入门 | 青训营笔记

110 阅读2分钟

一、下载GO

  • go安装文件以及源代码 Downloads - The Go Programming Language
  • 下载对应平台的二进制文件以及安装
  • 环境变量
    GOROOT: go的安装目录
    GOPATH: src 存放源代码
    pkg 存放依赖包
    bin 存放可执行文件
    其他常用变量: GOOS GOARCH GOPROXY
    GOPROXY建议使用: export GOPROXY=goproxy.cn

二、GO语言一些基本命令

  • build: 编译包和依赖
  • clean: 移除对象文件
  • doc: 显示包或者符号的文档
  • env: 打印go的环境信息
  • bug: 启动错误报告
  • fix: 运行go tool fix
  • fmt: 运行gofmt进行格式化
  • generate: 从processing source生成go文件
  • get: 下载并安装包和依赖
  • install: 编译并安装包和依赖
  • list: 列出包
  • run: 编译并运行go程序
  • test: 运行测试
  • tool: 运行go提供的工具
  • version: 显示go的版本
  • vet: 运行go tool vet
  • mod: module maintenance 三、 Go语言的基本控制结构

1. If

if condition1 {
        // do something
} else if condition2 { 
        // do something else 
} else {
        // catch-all or default
}
if v:= x; v < 0 {
        // do something
}

2. Switch

switch var1 {
        case val1:
        case var2:
                fallthrough
        case val3:
                f()
        default:
                ...
}

3. for

for i := 0; i < 100; i++ {
        sum += 1
} 
for ; sum < 100; {
        sum += 10
}
for {
        if condition {
                break
        }
        // do something
}

三、Go语言的数据结构

1. 变量和常量

  • const identifier type
  • var identifier type

2. 类型转换

var i int = 1
var f float64 = float64(i) 或者 f := float64(i)

3.Make 和 New

New是返回指针的地址
Make则为返回第一个元素,可预设内存空间,避免未来的内存拷贝

四、Go语言函数

1. Go语言传参方式

// method 1
fmt.Println("os args is:", os.Args)
//method 2
name := flag.String("name", "sen", "input you english name")
flag.Parse()

2. Init函数

Init函数会在包初始化的时候运行
当多个依赖引用统一的项目, 且被引用项目的初始化在init中完成,并且不可重复运行时,会导致启动错误

var myVariable int = 0
func init() {
    myVariable = 1
}

3. 传递变长参数

func append(slice []Type, elems ...Type) []Type

4. 回调函数

func Callback(x int, f func(int, int)) {
    f(x, x)
}

5. 方法接口

方法: 作用在接受者上的函数
func (recv receiver_type) method(parameter_list) (return_value_list)

package main
 
import "fmt"
 
type Human struct {
	first, last string
}
 
func (h *Human) getName() string {
	return h.first + " " + h.last
}
 
type IF interface {
	getName() string
}
 
type Car struct {
	first1, last1 string
}
 
func (c Car) getName() string {
	return c.first1 + " " + c.last1
}
 
func main() {
	interfaces := []IF{}
	h := new(Human)
	h.first = "ri"
	h.last = "bbon"
 
	c := new(Car)
	c.first1 = "car"
	c.last1 = "car1"
	interfaces = append(interfaces, h)
	interfaces = append(interfaces, c)
	for _, it := range interfaces {
		fmt.Println(it.getName())
	}
 
	g := Human{}
	g.first = "aa"
	g.last = "cc"
	fmt.Println(g.getName())
 
	c = new(Car)
	c.first1 = "ri"
	c.last1 = "bbon"
	fmt.Println(c.getName())
}

6. 反射机制

TypeOf 返回被检查对象的类型
ValueOf返回被检查对象的值

package main
 
import (
	"fmt"
	"reflect"
)
 
type T struct {
	A string
	b string
}
 
func (t T) GetString() string {
	return t.A + "-----"
}
 
func main() {
	my_map := make(map[string] string, 10)
	my_map["a"] = "b"
	t := reflect.TypeOf(my_map)
	v := reflect.ValueOf(my_map)
	fmt.Println(t, v, v.NumMethod())
 
	my_struct := T{A: "11", b: "cc"}
	fmt.Println(reflect.TypeOf(my_struct))
	v = reflect.ValueOf(my_struct)
	fmt.Println(v.NumMethod(), v.NumField(), 
		v.Method(0).Call(nil), v.Field(0), 
		v.Field(1))
}

7. Go语言中的面向对象编程

  • 可见性控制
    • public - 常量、变量、类型、接口、结构、函数等的名称大写
    • private - 非大写的只能包內使用
  • 继承
    • 通过组合实现, 内嵌一个或者多个struct
  • 多态
    • 通过接口实现,通过接口定义方法集, 编写多套实现

8. Json编解码

Marshal: 从struct --> string
Unmarshal: 从string --> struct

package main
 
import (
	"encoding/json"
	"fmt"
	"reflect"
)
 
type Human struct {
	Name string
	Age int
}
 
func StringToStruct(humanStr string) Human  {
	h := Human{}
	err := json.Unmarshal([]byte(humanStr), &h)
	if err != nil {
		fmt.Println(err)
	}
	return h
}
 
func structToString(h Human) string {
	h.Age = 30000
	h.Name = "ribbon"
	updateBytes, err := json.Marshal(h)
	if err != nil {
		fmt.Println(err)
	}
 
	return string(updateBytes)
}
 
func main() {
	h := Human{}
	s := structToString(h)
	fmt.Println(s)
	
	human := StringToStruct(s)
	fmt.Println(reflect.ValueOf(human))
}

Json包使用map[string]interface{} 和 []interface{} 类型保存任意对象

package main
 
import (
	"encoding/json"
	"fmt"
)
 
type Human struct {
	Name string
	Age int
}
 
func structToString(h Human) string {
	h.Age = 30000
	h.Name = "ribbon"
	updateBytes, err := json.Marshal(h)
	if err != nil {
		fmt.Println(err)
	}
 
	return string(updateBytes)
}
 
func main() {
	h := Human{}
	s := structToString(h)
	fmt.Println(s)
 
	var obj interface{}
	err := json.Unmarshal([]byte(s), &obj)
	if err != nil {
		return
	}
	objMap, _ := obj.(map[string]interface{})
	for key, value := range objMap {
		switch value.(type) {
		case string:
			fmt.Printf("%s: %s ", key, value)
		case int:
			fmt.Printf("%s: %d ", key, value)
		default:
			fmt.Printf("%s: %v ", key, value)
		}
	}
 
	var obj1 map[string] interface{}
	err = json.Unmarshal([]byte(s), &obj1)
	if err != nil {
		return
	}
	for key, value := range obj1 {
		switch value.(type) {
		case string:
			fmt.Printf("%s: %s ", key, value)
		case int:
			fmt.Printf("%s: %d ", key, value)
		default:
			fmt.Printf("%s: %v ", key, value)
		}
	}
}

9. 错误处理

Go没有内置的exception机制, 只提供error接口供定义错误

type error interface {
        Error() string

}

可以通过error.New or fmt.Errorf创建新的error, 通常应用程序对error的处理大部分是判断error是否为nil

10. defer Panic recover

defer这个相当于python java的finally
panic:可以再系统出现不可恢复错误的时候主动调用panic, panic会使当前线程直接crash
recover: 函数从panic或者错误场景中恢复

defer func() {
	if err := recover(); err != nil {
			fmt.Println(err)
	}
} ()
panic("\njson is error\n")

未完待续。。。