Golang基础

基础

package main
import (
  "fmt",
  "math/rand"
  "math"
)

func main() {
  //导出的函数或者值必须大写开头
  ftm.Print("My favorite time it", rand.Intn(10))
  fmt.Println(math.Pi)
}

定义变量

//变量类型
//rune,int8,int16,int32,int64
//byte,uint8,uint16,uint32,uint64
//rune == int32
//byte == uint8

//go中字符串是不可变的
var s string = "Hello"
s[0] = 'W' //报错
//如果要修改字符串
s := "Hello"
c := []byte(s)//字符串s转化为字符数组
c[0] = 'W'
s2 := string(c)  //转化为字符串
//字符串虽然无法改写,但是可以切片
var i, j = 1, 2
var x, y int = 1, 2
k := 3

var (
  ToBe  bool        = false
  MaxInt uint64     = 1 << 64 - 1
)

const f = "%T(%v)\\n"

const (
  Big = 1 << 100
  Small = Big >> 99
)

const (
  x = iota  //0
  y = iota  //1
  z = iota  //2
  w         //3
)
err = errors.New("emmit a error")

函数

func add(x, y int) int {
  return x + y
}

func swap(x, y) (string, string) {
  return y, x
}

//裸返回
func split(sum int) (x, y int) {
  x = sum * 4 / 9
  y = sum - x
  return
}

//将函数作为变量
type testInt func(int) bool  //申明一个函数类型

循环

sum := 0
for i := 0 ; i < 10; i++ {
  sum += i
}

sum := 0
for ;sum < 1000; {
  sum += sum
}

sum := 0
for sum < 1000 {
  sum += sum
}

//死循环
for {

}

条件语句

if x < 10 {
  //.....
}

if v := math.Pow(x, n); v < lim {
  //...
} else {
  //....
}

import runtime
switch os := runtime.GOOS; os {
  case "darwin":
    fmt.Println("Mac os")
  case "linux":
    fmt.Println("Linux.")
  default:
    fmt.Printf("%s", os)
}

import time
t := time.Now()
switch {
case t.Hour() < 12:
  fmt.Println("Good morning")
case t.Hour() < 17:
  fmt.Println("Good afternoon")
default:
  fmt.Println("Good evening")
}

指针

i, j := 42, 2701
p := &i
fmt.Println(*p)
*p = 81
//golang中没有指针运算

结构体

type Vertex struct {
  X int
  Y int
}
//创建结构体对象
v := Vertex{1, 2}
v.X = 12

p = &Vertex{1, 2}
p.X = 12

v := Vertex{X: 1}

数组和切片

var a [10]int                 //数组
//[3]int和[4]int是不同的类型,数组的长度不可变
c := [...]{4, 5, 6}  //自动推算长度
s := []int{2, 3, 4, 5, 6, 7} //切片

for i:=0; i < len(s); i++ {
  fmt.Println(s[i])
}

二维切片
game := [][]string{
        []string{"_", "_", "_"},
        []string{"_", "_", "_"},
        []string{"_", "_", "_"},
    }
game[0][0] = "X"
game[2][2] = "O"
game[2][0] = "X"
game[1][0] = "O"
game[0][2] = "X"

strings.Join(game[0], " ") //数组变字符串

//对slice切片
s[low:hig] //左闭右开

//构造slice
a := make([]int, 5) //len(a) == 5
b := make([]int, 0, 5) // len(b) = 0, cap(b) = 5
//slice的0值为nil

//向slice添加元素
var a []int

a = append(a, 0) //如果原slice不够长,则创建新slice

var pow = []int{1, 2, 4, 8, 16, 32}
for i, v := range pow {
  
}
for _,v := range pow{

}

map

type Vertex struct {
  Lat, Long float64
}

var m map[string]Vertex
m = make(map[string]Vertex)

var m = map[string]Vertex{
    "Bell Labs": {40.68433, -74.39967},
    "Google":    {37.42202, -122.08408},
}

delete(m, "Bell Labs")

v, ok := m["Bell Labs"]

函数传参传函数

func compute(fn func(float64, float64) float64) float64 {
    return fn(3, 4)
}
//函数闭包
func adder() func(int) int {
  sum := 0
  return func(x int) int {
    sum+=x
    return sum 
  }
}

//菲波那切数列
func fibonacci() func() int {
    a, b := 0, 1
    return func() int {
        a, b = b, a+b
        return a
    }
}

方法

type Vertex struct {
  X,Y float64
}

func (v *Vertex) Abs() float64 {
  return  math.Sqrt(v.X * v.X + v.Y*v.Y)
}

v := &Vertex{1, 3}
s := v.Abs()

接口

//接口类型是由一组方法定义的集合。
type  Abser interface {
  Abs() float
}

type Reader interface {
    Read(b []byte) (n int, err error)
}

type Writer interface {
    Write(b []byte) (n int, err error)
}

type ReadWriter interface {
    Reader
    Writer
}

//fmt包进行输出的时候回调用这个接口,如果想自定义输出,可以实现这个方法
type Stringer interface {
    String() string
}

Reader

package main

import (
    "fmt"
    "io"
    "strings"
)

func main() {
    r := strings.NewReader("Hello, Reader!")

    b := make([]byte, 8)
    for {
        n, err := r.Read(b)
        fmt.Printf("n = %v err = %v b = %v\\n", n, err, b)
        fmt.Printf("b[:n] = %q\\n", b[:n])
        if err == io.EOF {
            break
        }
    }
}

最简单的web服务器

package main

import (
    "fmt"
    "log"
    "net/http"
)

type Hello struct{}

func (h Hello) ServeHTTP(
    w http.ResponseWriter,
    r *http.Request) {
    fmt.Fprint(w, "Hello!")
}

func main() {
    var h Hello
    err := http.ListenAndServe("localhost:4000", h)
    if err != nil {
        log.Fatal(err)
    }
}

goroutine

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}

chanel

ch := make(chan int)

ch <- v    // 将 v 送入 channel ch。
v := <-ch  // 从 ch 接收,并且赋值给 v。

//缓冲chanel
ch := make(chan int, 100)

//发送者可以close一个channel来表示没有值会被发送
//接受者可以通过赋值语句的第二个参数来测试channel是否被关闭
v, ok := <-ch

for i := range c //会不断从channel接收值,直到被关闭

package main

import (
    "fmt"
)

func fibonacci(n int, c chan int) {
    x, y := 0, 1
    for i := 0; i < n; i++ {
        c <- x
        x, y = y, x+y
    }
    close(c)
}

func main() {
    c := make(chan int, 10)
    go fibonacci(cap(c), c)
    for i := range c {
        fmt.Println(i)
    }
}

//select会阻塞,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支。
//当多个都准备好的时候,会随机选择一个。
//当 select中的其他条件分支都没有准备好的时候,default分支会被执行。
package main

import "fmt"

func fibonacci(c, quit chan int) {
    x, y := 0, 1
    for {
        select {
        case c <- x:
            x, y = y, x+y
        case <-quit:
            fmt.Println("quit")
            return
        }
    }
}

func main() {
    c := make(chan int)
    quit := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()
    fibonacci(c, quit)
}

互斥

package main

import (
    "fmt"
    "sync"
    "time"
)

// SafeCounter 的并发使用是安全的。
type SafeCounter struct {
    v   map[string]int
    mux sync.Mutex
}

// Inc 增加给定 key 的计数器的值。
func (c *SafeCounter) Inc(key string) {
    c.mux.Lock()
    // Lock 之后同一时刻只有一个 goroutine 能访问 c.v
    c.v[key]++
    c.mux.Unlock()
}

// Value 返回给定 key 的计数器的当前值。
func (c *SafeCounter) Value(key string) int {
    c.mux.Lock()
    // Lock 之后同一时刻只有一个 goroutine 能访问 c.v
    defer c.mux.Unlock()
    return c.v[key]
}

func main() {
    c := SafeCounter{v: make(map[string]int)}
    for i := 0; i < 1000; i++ {
        go c.Inc("somekey")
    }

    time.Sleep(time.Second)
    fmt.Println(c.Value("somekey"))
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 1.当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的...
    球球之家阅读 4,822评论 0 1
  • 本篇通过实现一个自定义的栈,来学习Go语言的自定义类型及其方法首先栈的概念不用多说,它是一种支持从顶端插入或删除的...
    码码码码阅读 1,498评论 2 5
  • 声明和初始化 声明的原则是: 指明存储数据的类型 指明存储元素的数量,也就是数组长度 以上我们声明了一个数组 ar...
    与蟒唯舞阅读 3,344评论 0 3
  • 出处---Go编程语言 欢迎来到 Go 编程语言指南。本指南涵盖了该语言的大部分重要特性 Go 语言的交互式简介,...
    Tuberose阅读 18,396评论 1 46
  • Go 内置关键字(25个均为小写) break default func in...
    战神汤姆阅读 509评论 0 0