第一节课,Go入门| 青训营笔记

51 阅读4分钟

Go入门

变量有stringintboolfloat,。。。,常量只是在变量前面加const

在Go中,switch结构不需要加break,这是与其他语言不同的地方,其他的地方都一样。

Go的数组和其他语言的数组一样,不同的是切片,切片是长度可变的数组,使用make来创建切片,当切片的容量不够的时候,就会触发扩容机制,在使用make来创建切片的时候也可以直接指定长度。可以使用copy方法来复制一个切片 在这个切片扩容上颇有讲究,如果切片的容量小于1024个元素,那么扩容的时候slice的cap就乘以2;一旦元素个数超过1024个元素,增长因子就变成1.25,即每次增加原来容量的四分之一。- 如果扩容之后,还没有触及原数组的容量,那么,切片中的指针指向的位置,就还是原数组,如果扩容之后,超过了原数组的容量,那么,Go就会开辟一块新的内存,把原来的值拷贝过来,这种情况丝毫不会影响到原数组。go1.17. 18之后就变了。 Go1.18以后就不是设置的1024的阈值了,而是设置的256的阈值。 如果预估容量大于两倍扩容容量,那就直接按照预估容量来 如果原来的容量小于256,那么每次扩容就直接扩大两倍 如果原来的容量大于256,那就每次增加(旧容量+3X256)/4 总的来说,Go的设计者不断优化切片扩容的机制,其目的只有一个:就是控制让小的切片容量增长速度快一点,减少内存分配次数,而让大切片容量增长率小一点,更好地节省内存 学到了 学到了。深有感触

go的map,在map中删除一个元素使用的是delete方法,delete(mapname,key)使用val,ok:=map[key]这样可以使用ok来判断map中的这个key是否存在。

在go语言中,基本上所有的函数都是返回两个值,一个值是真实值,另一个值是函数是否成功计算。

在Go里面,可以去定义一些结构体方法,这就类似于其他面对对象语言中,类的方法。 这样的话结构体的实例化对象就可以通过对象.方法()的方式去调用这个方法。

在结构体方法中,也有不带指针和带指针两种方式,使用带指针的就可以实现对结构体内部信息的一个修改。

package main
​
import "fmt"type User struct {
    name string
    age  int
}
​
func (user User) changeName(name string) {
    user.name = name
}
​
func (user *User) changeName2(name string) {
    user.name = name
}

GO错误处理

不同于java的错误处理方式,go的错误是在返回值上,在函数的返回值上加一个error,这就代表这个函数可能会返回错误,然后使用if判断是否有错误。一个函数如果要返回一个错误可以用errors.New("error message")

字符串格式化的方法

%v 打印任意一个变量 值

%+v 更加详细的打印任意一个变量 变量名和值

%#v 更进一步详细的打印一个变量 类型名称和值

JSON处理

package main
​
import (
    "encoding/json"
    "fmt"
)
​
type userInfo struct {
    Name  string
    Age   int `json:"age"`
    Hobby []string
}
​
func main() {
    a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
    buf, err := json.Marshal(a)
    if err != nil {
        panic(err)
    }
​
    buf, err = json.MarshalIndent(a, "", "\t")
    if err != nil {
        panic(err)
    }
    fmt.Println(string(buf))
​
    var b userInfo
    err = json.Unmarshal(buf, &b)
    if err != nil {
        panic(err)
    }
}
​

MarshalIndent方法的作用是在控制台打印json对象的时候能够有结构的打印,会更加好看一些。

时间处理

在Go中,最常用的时间处理就是time包,time.Now()可以快速获取当前的时间。特别的,使用时间.Sub(t)来获取两个时间的时间段(这样以后处理时间段就方便了)然后再调用Minutes或者是Seconds就可以看 到是多少分钟,多少秒.

特别的需要记住的是,go的时间格式化有Format和Parse两种方式,其二是不同于其他语言的格式化方式,GO的时间格式化是直接给一个例子,这个例子是2006-01-02 15:04:05这个特定的时间格式来格式化的。因此,不是使用yyyy-mm-dd这种方式来的。

数字解析

strconv.ParseInt("str","进制",numer)来进行字符串to interesting的转换。在这里没有记录具体的API,只是把自己经常记不住的API贴了出来,加深印象,不要每次转换二进制的时候都傻傻用辗转相除哈哈哈😄。

进程信息获取

os.Args获取执行的参数,go xxx.go xxx xxx

os.Getenv 来获取环境变量,

os.Setenv 来设置环境变量

使用exec.Command来获取子进程并获取其输入和输出

个人感受

因为之前是学过一点Go的,因此大部分知识也算是知道,不过这个课确实是查漏补缺了,再一次对某些用法加深了印象。