1、多变量初始化
data, i := [3]int{0, 1, 2}, 0
2、占位符
特殊只写变量 "_",用于忽略值占位。
3、直接.用指针访问..目标对象成员
package main import "fmt" func main() { type data struct{ a int } var d = data{1234} var p *data p = &d fmt.Printf("%p, %v\n", p, p.a) // 直接.用指针访问..目标对象成员,.无须转换。 }
输出:
0x2101ef018, 1234
4、代码格式
package main func main() { x := 1 if n := "abc"; x > 0 { // 初始化语句未必就是定义变量,比如 println("init") 也是可以的。 println(n[2]) } else if x < 0 { // 注意 else if 和 else 左⼤大括号位置。 println(n[1]) } else { println(n[0]) } }
5、常见的循环
package main func main() { s := "abc" for i, n := 0, len(s); i < n; i++ { // 常⻅见的 for 循环,⽀支持初始化语句。 println(s[i]) } n := len(s) for n > 0 { // 替代 while (n > 0) {} println(s[n]) // 替代 for (; n > 0;) {} n-- } for { // 替代 while (true) {} println(s) // 替代 for (;;) {} } }
6、
捕获函数 recover 只有在延迟调用内直接调用才会终止错误。方法内都不行
7、错误捕获
package main import "errors" //ErrDivByZero 错误描述 var ErrDivByZero = errors.New("division by zero") func div(x, y int) (int, error) { if y == 0 { return 0, ErrDivByZero } return x / y, nil }
func main() { switch z, err := div(10, 0); err { case nil: println(z) case ErrDivByZero: panic(err) } }
8、值拷贝行为会造成性能问题,通常会建议使用 slice,或数组指针。
9、
Slice读写操作实际目标是底层数组,只需注意索引号的差别。会修改原数组。
s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} s1 := s[2:5] // [2 3 4] s2 := s1[2:6:7] // [4 5 6 7]
10、
*p是给p取值,p一定是一个指针,如果p是指针,那么*p就是指针的对象。
如果p是一个指针的指针,那么*p就是指针。
&d是给d取地址,如果d是对象,那么&d就是指针,
如果d是指针,那么&d就是指针的指针。
11、
[]中为空就是切片,不为空就是数组
mySlice3 := []int{1, 2, 3, 4, 5}//切片 mySlice3 := [5]int{1, 2, 3, 4, 5}//数组
12、自定义错误
package main import ( "fmt" "os" ) func main() { fi, err := Stat("a.txt") if err != nil { if e, ok := err.(*PathError); ok { // 获取PathError类型变量e中的其他信息并处理 //fmt.Printf("错误:%s", e6.Err) _ = e } } else { fmt.Println(fi.Name()) } _ = fi } //Stat 查询文件信息 func Stat(name string) (fi os.FileInfo, err error) { file, err := os.Stat(name) if err != nil { return nil, &PathError{"stat", name, err} } return file, nil } //PathError 自定义错误 type PathError struct { Op string Path string Err error } //Error 获取自定义错误 func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }
13、
interface{}相当于C#的Object
14、
json.Marshal()序列化
json.Unmarshal()反序列化