zoukankan      html  css  js  c++  java
  • 一文学会Go语言

    go语言随手记 -- go语言定位于高并发服务端程序

    1.基本数据类型

    bool
    string
    int int8 int16 int32 int64
    uint uint8 uint16 uint32 uint64 uintptr
    byte // uint8 的别名
    rune // int32 的别名 // 表示一个 Unicode 码点 java的char
    float32 float64
    complex64 complex128

    2.基本数据结构 List and Map

    go语言中没有list,只有数组(定长)和切片(不定长,有容量)

    var list []int =[]int{1,2,3}; var slice []int= list[:]

    go语言支持map

    var m map[string]string = map[string]string{"author": "Mignet"}
    for k, v := range m {
        fmt.Println(k, v)
    }

    3.面向对象 struct interface function

    go语言认为:封装、继承和多态,对于面向对象来讲都是多余的,所以它通过检查是否实现接口interface的方法function来判定对象是否可以互相赋值。

    struct定义结构体,function定义方法,如果这个function恰好和interface的function定义一样,就认为其实现了该interface。典型的如:Error和Print都是接口,但你不用声明,直接实现方法即可用

    function是go语言的一等公民,它支持一次返回多个值,这是和很多语言不一样的。

    方法可见性:go抛弃了public、private等关键字和概念,只看function的首字母,大写就表示public

    4.指针和引用 * and &

     *T 是指向 T 类型值的指针。其零值为 nil。
    var p *int
    & 操作符会生成一个指向其操作数的指针。
    i := 42
    p = &i
    * 操作符表示指针指向的底层值。
    fmt.Println(*p) // 通过指针 p 读取 i
    *p = 21 // 通过指针 p 设置 i

    5.Go程 Goroutine 名字来自Coroutine

    当需要启动一个独立协程执行代码时,代码块前面加上go即可

    6.并发和互斥锁 channel select and mutex

    当发生并发争抢资源时,go推荐的模式是:要通讯,不要共享变量。用通信来共享数据,而不是通过共享数据来进行通信。所以它提供了channel作为协程通讯的通道。

    package main
    
    import "fmt"
    
    func Count(i int, ch chan int) {
        fmt.Println("Counting", i)
        ch <- 1
    }
    func main() {
        chs := make([]chan int, 10)
        for i := 0; i < 10; i++ {
            chs[i] = make(chan int)
            go Count(i, chs[i])
        }
        for _, ch := range chs {
            <-ch
        }
    }

    这个小例子充分展示了多协程通讯的使用

    (当channel需要switch case的时候,用select关键字代替switch)

    mutex什么时候用?sync.Mutex和sync.RWMutex用在我们只是想保证每次只有一个 Go 程能够访问一个共享的变量,从而避免冲突的情况下。比如java中为了线程安全在数据结构的读操作和写操作中的加锁动作

    单例,go认为这种全局只执行一次的情况没必要想那么复杂,所以提供了sync.Once,保证全局唯一性执行且线程安全,比如:once.Do(setup)

    7.官方包 > 文件读写、网络编程、加密解密、序列反序、日志
    Go语言内置提供了基本的操作包支持:io、net(http/rpc)、encoding(xml/json)、crypto(md5/sha1)、log

    8.其实还有一些细节,但你完全可以在深入使用的时候再处理。现在这些已经足够用了

    如果你还在犹豫,不妨先把编程环境搭起来试试,顺便可以跟着我实践一下

  • 相关阅读:
    网络应用框架Apache MINA 一个应用样例(转)
    Linux安装JDK详细步骤(转)
    MySQL主从复制配置
    linux IP 设置
    Log4j的应用实例
    linux 远程复制
    MySQL外部访问配置
    Camshift算法2
    Canny边缘检测
    cvCopy()和cvCloneImage()的区别
  • 原文地址:https://www.cnblogs.com/mignet/p/Go_learning_All_in_one.html
Copyright © 2011-2022 走看看