golang基础
1.slice
b := make([]int, 0, 5) //创建一个slice,长度为0,容量为5
b := []int{1,2,3,4,5}
b = b[:cap(b)] //b的长度为5,容量为5
b = b[1:] //b的长度为4,容量为4
cap()函数返回的是数组切片分配的空间大小
扩容与不扩容的区别:https://blog.csdn.net/cyk2396/article/details/78893420
2.range
range是一个内置函数。可以遍历数组、切片slice、字典map。
当遍历数组和切片的时候,返回的是索引和元素。
如果你不需要 range 返回的某个值,比如 index,你可以把它写成 _ ,这个就可以忽略这个返回值了。
package main
import (
"fmt"
)
func main() {
//range遍历切片的所有元素,并求和
fibo := []int{2,3,5,8,13,34,55}
sum := 0
for _, num := range fibo {
sum += num
fmt.Println(num, sum)
}
fmt.Println("sum:", sum)
//range遍历字符串,返回字符索引和Unicode编码。
for i, c := range "go"{
fmt.Printf("%d, %c\n", i, c)
}
//range遍历字典,返回键值对。
kvs := map[string]string{"a":"apple", "b":"banana", "c":"cofox"}
for k, v := range kvs {
fmt.Printf("%s -> %v\n", k, v)
}
}
3.map
判断方式为value,ok := map[key], ok为true则存在
package main
import "fmt"
func main() {
demo := map[string]string{
"a": "fefef",
}
//错误,a存在,但是返回false
fmt.Println(demo["a"])
//正确判断方法
_, ok := demo["b"]
fmt.Println(ok)
}
4.变量
1)= 与:=的区别
= 是赋值, := 是声明变量并赋值。
5.指针
在一些多个点共同对一个点享有修改权的场景中,指针类型很有用。
6.Error判断
error 为 nil 时表示成功,error 为非 nil 时,表示有错误
package main
import (
"fmt"
"time"
)
type MyError struct {
When time.Time
What string
}
func (e *MyError) Error() string {
return fmt.Sprintf("at %v --> %s", e.When, e.What)
}
func run() error {
return &MyError{
time.Now(),
"it didn't work",
}
}
func main() {
if err := run(); err != nil {
fmt.Println(err)
}
}
6.IO
https://www.jianshu.com/p/dad73b68e7eb
7.Reader数据流
package main
import (
"io"
"os"
"strings"
"errors"
"fmt"
)
type rot13Reader struct {
r io.Reader
}
func (rot *rot13Reader) Read(buf []byte) (n int, err error) {
rot13 := map[byte]byte{
'A':'N',
'B':'O',
'C':'P',
'D':'Q',
'E':'R',
'F':'S',
'G':'T',
'H':'U',
'I':'V',
'J':'W',
'K':'X',
'L':'Y',
'M':'Z',
'N':'A',
'O':'B',
'P':'C',
'Q':'D',
'R':'E',
'S':'F',
'T':'G',
'U':'H',
'V':'I',
'W':'J',
'X':'K',
'Y':'L',
'Z':'M',
'a':'n',
'b':'o',
'c':'p',
'd':'q',
'e':'r',
'f':'s',
'g':'t',
'h':'u',
'i':'v',
'j':'w',
'k':'x',
'l':'y',
'm':'z',
'n':'a',
'o':'b',
'p':'c',
'q':'d',
'r':'e',
's':'f',
't':'g',
'u':'h',
'v':'i',
'w':'j',
'x':'k',
'y':'l',
'z':'m',
'0':'9',
'1':'8',
'2':'7',
'3':'6',
'4':'5',
'5':'4',
'6':'3',
'7':'2',
'8':'1',
'9':'0',
' ':' ',
'~':'~',
'!':'!',
'@':'@',
'#':'#',
'$':'$',
'%':'%',
'^':'^',
'&':'&',
'*':'*',
'(':'(',
')':')',
'_':'_',
'+':'+',
'`':'`',
'-':'-',
'=':'=',
'?':'?',
',':',',
'.':'.',
}
l, err := rot.r.Read(buf)
if err != nil{
return 0, errors.New("Read something wrong")
}
for i, v := range buf{
if v == byte(0){
return i, nil
}
buf[i] = rot13[v]
}
return l, nil
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr? Lrf,Zl rznvy vf whaobwvna@dd.pbz")
s1 := strings.NewReader("You cracked the code? Yes,My email is junbojian@qq.com")
r := rot13Reader {s}
r1 := rot13Reader{s1}
var c string
c = "ffee"
fmt.Println(c)
io.Copy(c, &r)
fmt.Println("")
io.Copy(os.Stdout, &r1)
}
8.web
package main
import (
"fmt"
"net/http"
"log"
)
type dollars float32
func (d dollars) String() string { return fmt.Sprintf("$%.2f", d) }
type MyHandler map[string]dollars
func (self MyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
switch req.URL.Path {
case "/list":
for item, price := range self {
fmt.Fprintf(w, "%s: %s\n", item, price)
}
case "/price":
item := req.URL.Query().Get("item") //传参数
//item := req.Form.Get("item")
price, ok := self[item]
fmt.Println(ok)
if !ok {
w.WriteHeader(http.StatusNotFound) // 404
fmt.Fprintf(w, "no such item: %q\n", item)
return
}
fmt.Fprintf(w, "%s\n", price)
default:
w.WriteHeader(http.StatusNotFound) // 404
fmt.Fprintf(w, "no such page: %s\n", req.URL)
fmt.Fprintf(w, "no such page: %s%s", req.Host,req.URL)
}
}
func main() {
handler := MyHandler{"shoes": 50, "socks": 5}
log.Fatal(http.ListenAndServe(":7000", handler))
}
# w.WriteHeader(http.StatusNotFound) // http response code
9.channel
close作用:
package main
import "fmt"
func fibonacci(n int, ch chan int) {
x, y := 0, 1
for i := 0; i < n; i++{
ch <- x
x, y = y, x + y
}
close(ch)
}
func main() {
ch := make(chan int, 10)
go fibonacci(cap(ch), ch)
for i := range ch{
fmt.Println(i)
}
}

浙公网安备 33010602011771号