go语言学习资源整理及代码记录

每天坚持学习和敲下代码,公司开发环境配置个人GitHub容易冲突,记录下吧

一、Go比较好学习资源

初级:

Go 语言设计与实现
the way to go中文版
effective_go官方文档
其实任何packge的使用去官方网站都可以查用法

中级:

go源码分析 中文简易版本
For-learning-Go-Tutorial
这周看的就是上面这个文档,内容比较深,只是粗浅了解下
《Go语言核心36讲》 极客时间的

将标准库全部都过一遍(转载自Go 语言学习路线指南):

至少要叫常用的全都看一遍,如 strings /strconv/http 等,如果有能力可以将它们都记住,如果记忆力不太好(像我这样)至少也要知道有什么,用到的时候通过手册可以快速找到。

官方标准库: https://golang.org/pkg/

中文版的标准库: https://studygolang.com/static/pkgdoc/main…

极力推荐 https://github.com/astaxie/gopkg ,可以在学习的时候看这个,有关于标准库的详细说明和示例,学习起来会容易一些,等全都明白了要使用的时候可以去查看上面的文档。
《Go 语言标准库》 The Golang Standard Library by Example,和上一个结合来看

go的学习路线图

从github上找了张,激励下自己:
go语言学习资源整理及代码记录_第1张图片

二、本周代码记录

根据一个youtube博主学的笔记
package main

import (
	"fmt"
	"reflect"
	"math"
	"errors"
)

//test for range
func testFor() {
	arr := []string{"a", "b", "c"}
	fmt.Println("type is :", reflect.TypeOf(arr))

	for index, val := range arr {
		fmt.Printf("index:%d, value:%s\n", index, val)
	}
}

//test map
func testMap() {
	m := make(map[string]string)
	m["a"] = "apple"
	m["b"] = "banama"

	for key, val := range m {
		fmt.Println("key:", key, "val:", val)
	}
}

func main() {
	var i int = 5
	fmt.Println("this is int:",reflect.TypeOf(i))

	testFor()
	testMap()
	resSum := sum(3,4)
	fmt.Println("sum", resSum)

	resSqrt,err := sqrt(9)
	if err != nil {
		fmt.Println("fail:", err)
		return 
	}
	fmt.Println("succ:", resSqrt)

	p := person{name:"coopers", age:27}
	fmt.Println(p)

	 x := 7
	inc(&x)
	fmt.Println(x)
}

//test sum 
func sum(x,y int) int {
	return x+y
}

//test error
func sqrt(x float64) (float64, error) {
	if x < 0 {
		return 0, errors.New("undifine for negative numbers")
	}
	return math.Sqrt(x), nil
}

//test struct
type person struct {
	name string
	age int
}

//test pointer
func inc(x *int) {
	*x++
}
格式整理及变量显示
go fmt hello.go可以自动整理注释对齐及其他格式
➜  example go env GOPATH
/data/home/cooperswang/go
➜  example go env GOROOT
/usr/local/go

后面的都是在这个博主的文章下学习的:

数组学习
package main

import "fmt"

func main() {
        fmt.Println("vim-go")

        //测试数组默认值
        var m [3]int = [3]int{1, 2, 3}
        var n [3]int = [3]int{1,2}
        fmt.Println("m:", m, "n",n)
        fmt.Println(n[2])

        //数组长度默认值
        mm := [...]int{1, 2, 3}
        fmt.Printf("%T\n", mm)

        //数组相等:长度及元素必须相等
        arr1 := [3]int{1, 2, 3}
        arr2 := [3]int{1, 2, 3}
        arr3 := [3]int{1, 2, 4}
        fmt.Println(arr1 == arr2, arr1 == arr3)
}
切片学习
package main

import (
        "fmt"
_       "strings"
)

func main(){
   p:=[]int{1,2,3}
   fmt.Println("p:",p)

   m1 :=p[:2]
   fmt.Println("m1:",m1)

   m2 := m1[1:]
   fmt.Println("m2:",m2)

   m3 := m2[:2]
   m4 := p[:2][1:][:2]
   fmt.Printf("m3%T",m3,"m4%T",m4)
   fmt.Println("m3",m3)
   fmt.Println("m4",m4)

   //由于输入输出slice共享底层数组
   data := []string{"1","","3"}
   //fmt.Printf("%q\n", nonempty(data))
   fmt.Printf("%q\n", nonempty2(data))
   fmt.Printf("%q\n", data)
}

func nonempty(strings []string) []string {
        i := 0
        for _, s := range strings {
                if s != "" {
                        strings[i] = s
                        i++
                }
        }
        return strings[:i]
}

func nonempty2(strings []string) []string {
        out := strings[:0] //zero-length slice of strings
        for _, s := range strings {
                if s != "" {
                        out = append(out, s)
                }
        }
        return  out
}
map学习
package main

import "fmt"

func main() {
        //声明
        //var m map[string] string

        m := map[string]int {
                "paopao": 001,
                "coopers":002,
        }

        //等价于
        //m := make(map[string] int)
        //m["paopao"] = 001
        //m["coopers"] = 002

        fmt.Println(m) //map无序输出

        delete(m, "paopao") //支持删除

        m["coopers"] +=108 //支持自增

        //不支持取地址
        //_ = &m["coopers"] //cannot take the address of m["coopers"]

        m["cooperswang"] = 233
        for k, v := range m {
                fmt.Printf("%s\t%d\n", k, v)
        }
        fmt.Println(m)
}
json学习
package main

import (
        "encoding/json"
        "fmt"
)

//首字母大写的可导出字段
type Server struct {
      ServerName string
      ServerIP   string
}

//repeat slice
type Serverslice struct {
      Servers []Server
}

func main() {
     var s Serverslice
    //结构体转json
        s.Servers = append(s.Servers, Server{ServerName: "Shanghai", ServerIP: "127.0.0.1"})
    s.Servers = append(s.Servers, Server{ServerName: "Beijing", ServerIP: "127.0.0.2"})
        b, err := json.Marshal(s)
        if err != nil {
                fmt.Println("json err:", err)
        }
        fmt.Println(string(b))
        //json转结构体
     json.Unmarshal([]byte(b), &s)
     fmt.Println(s)
}
结构体学习
package main

import "fmt"

func main() {
        var r Rectangle

        r.width = 100
        r.height = 200
        fmt.Println(r)


        var rr = Rectangle{width:30,height:40}
        fmt.Println(rr)

        //error
        fmt.Println("double_area:",double_area(r))
        fmt.Println("width:", r.width, "height:", r.height)

        var r2 = new(Rectangle)
        r2.width = 100
        r2.height = 200
        fmt.Println("double_area2:",double_area2(r2))
        fmt.Println("width:", r2.width, "height:", r2.height)
}

type Rectangle struct {
        width float64
        height float64
}


func double_area(r Rectangle) float64 {
        r.width *= 2
        r.height *= 2
        return r.width * r.height
}

func double_area2(r *Rectangle) float64 {
        r.width *= 2
        r.height *= 2
        return r.width * r.height
}

你可能感兴趣的:(Go学习)