Go入门
变量有string
、int
、bool
、float
,。。。,常量只是在变量前面加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的,因此大部分知识也算是知道,不过这个课确实是查漏补缺了,再一次对某些用法加深了印象。