每天坚持学习和敲下代码,公司开发环境配置个人GitHub容易冲突,记录下吧
Go 语言设计与实现
the way to go中文版
effective_go官方文档
其实任何packge的使用去官方网站都可以查用法
go源码分析 中文简易版本
For-learning-Go-Tutorial
这周看的就是上面这个文档,内容比较深,只是粗浅了解下
《Go语言核心36讲》 极客时间的
至少要叫常用的全都看一遍,如 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,和上一个结合来看
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
}
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)
}
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
}