1、原始字符串
func main() {
s := `功能介绍:
1、可以拍照
2、可以打电话`
fmt.Println(s)
}
2、字符串不能用序号取元素指针
func main() {
s := "abc"
fmt.Println(&s[1]) //error 636: cannot take the address of s[1]
}
3、range迭代取出的地址是相同的
4、fallthrough进入下一个case,退出case无需break
func main() {
a := 10
switch a {
case 10:
fmt.Println("hhh")
fallthrough
case 11:
fmt.Println("ggg")
default:
fmt.Println("fff")
}
}
5、函数变参只能由一个,且只能是最后一个
6、recover在延时调用defer内有效,其他返回nil
package main
import (
"fmt"
"log"
"runtime/debug"
)
func test(f func() int) {
defer func() {
if err := recover(); err != nil {
debug.PrintStack()
log.Println(err)
}
}()
fmt.Println(f())
}
func main() {
a := 0
fmt.Println(recover())
test(func() int {
return 10 / a
})
}
7、channel同步异步
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan int) //缓冲区同步
var wg sync.WaitGroup
go func() {
wg.Add(1)
defer wg.Done()
for c := range ch {
fmt.Println(c)
}
fmt.Println("recv over")
}()
ch <- 1
ch <- 2
ch <- 3
ch <- 4
ch <- 5
fmt.Println("send over")
close(ch)
wg.Wait()
}
8、uintptr被GC当做普通整数对象,不会回收指向的对象占用内存
9、reflect
10、go package
package is folder 包就是文件夹
package name is folder name 包名就是文件夹名字
package path is folder path 包路径就是文件夹路径
否则会出错
11、append、map、len、println都不是关键字,无需包含任何包, 因为它在builtin包里
12、临时转换一个含调用方法的接口
package main
import (
"fmt"
)
type person struct {
}
func (p *person) print() {
fmt.Println("person")
}
func main() {
//var p1 interface{print()} = new(person)
//p1.print()
var p interface{} = new(person)
p.(interface {
print()
}).print()
}
13、map其实就是泛型的概念,只是go不开放给用户,map的对象可以是任意类型包括结构体。map初始化格式要求严格。
m := map[int]string{
2: "jack",
3: "marry"}
m := map[int]string{
2: "jack",
3: "marry", //没有逗号编译不过
}14、