zoukankan      html  css  js  c++  java
  • Go 语言基础知识

    0. Go语言书单

    1. 文本注释
    // 单行注释
    /* */ 多行注释

    2. 变量赋值
    = 变量赋值
    := 声明变量并赋值

    3. 变量定义
    var name string
    var age int

    var name = "alex"
    var age = 123

    4. 变量类型转换
    string to int
    int, err := strconv.Atoi(string)

    string to int64
    int64, err := strconv.ParseInt(sting, 10, 64)

    int to string
    string := strconv.Itoa(int)

    int64 to string
    string := strconv.FormatInt(int64, 10)

    5. 变量类型判断
    1)i.(type) 只能在switch中使用
    2)reflect.TypeOf(x)

    6. Go 程序是通过package来组织的
    只有package名称为main的包可以包含main函数
    一个可执行程序有且只有一个main包
    通过import关键字来导入其他非main包
    main函数作为程序入口点启动
    Go 语言最少有个main()函数

    7. Go 语言中,使用大小写来决定该
    常量
    变量
    类型
    接口
    结构
    函数
    是否可以被外部包所调用

    函数名首字母小写即为 private:
    func getId() {}
    函数名首字母大写即为 public:
    func GetId() {}

    8、交换两个变量的值
    a, b = b, a

    9、空白标识符
    _ 跟Python一样

    10、unsafe.Sizeof()
    字符串类型在Go里是个结构,包含指向底层数组的指针和长度,这两部分每部分都是8个字节,所以字符串类型大小为16个字节。


    11、函数
    func function_name( [parameter list] ) [return_types] {
    函数体
    }

    函数传递参数:
    值传递
    引用传递
    引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数进行的修改,将影响到实际参数的值。

    12、 * 与 &
    & 是地址获取符,即获取某个变量的内存地址,例如 &a
    * 是指针运算符,可以表示一个变量是指针类型,也可以表示一个指针变量所指向的存储单元,也就是这个地址所存储的值。

    13、 Go 语言方法与函数的区别
    方法是特殊的函数,定义在某一特定的类型上,通过类型的实例来进行调用,这个实例被叫接收者(Receiver)。
    示例:
    type Circle struct {
      redius float64
    }

    func (c Circle) getArea() float64 {
      return 3.14 * c.redius * c.redius
    }

    func main() {
      var c1 Circle
      c1.redius = 10.00
      fmt.Println("Area of Circle(c1) = ", c1.getArea())
    }

    函数将变量作为参数: Function(recv)
    方法在变量上被调用:   recv.Method()

    注意: Go语言不允许为简单的内置类型添加方法。

    14、Go 语言面向对象
    Go 语言不像其他面向对象语言一样可以定义类(class),然后在类(class)中定义一堆方法(method)。
    但是Go 语言的方法 很巧妙的实现了这种效果,我们只需要在普通函数前面加个接受者(reciver, 写在函数名前的括号里面)。
    这样编译器就知道这个函数(方法 method)属于哪个type或struct了, 这样就实现了类似于类的method。
    在struct中声明变量,这样就实现了类似于类的属性。
    示例:
    type Person struct {
      name string
      age int
    }

    func (a Person) foo(){ // 接受者写在函数名前面的括号里面
      fmt.Printf("the %s age is %d.", a.name, a.age)
    }

    func main() {
      var aa Person // or aa := A{} 这非常像Python中实例化一个类
      aa.name = "alex"
      aa.age = 38
      aa.foo()
    }

    15、Go 语言接口
    Go 语言提供了另外一种数据类型 - 接口。
    它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

    16、Go 格式化输出
    %v 值的默认格式表示。当输出结构体时,扩展标志(%+v)会添加字段名
    %#v 值的Go语法表示
    %T 值的类型的Go语法表示
    %% 百分号

    布尔值:
    %t 单词true或false

    整数:
    %b 表示为二进制
    %c 该值对应的unicode码值
    %d 表示为十进制
    %o 表示为八进制
    %q 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
    %x 表示为十六进制,使用a-f
    %X 表示为十六进制,使用A-F
    %U 表示为Unicode格式:U+1234,等价于"U+%04X"

    字符串和[]byte:
    %s 直接输出字符串或者[]byte %q 该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示
    %x 每个字节用两字符十六进制数表示(使用a-f)
    %X 每个字节用两字符十六进制数表示(使用A-F)

    指针:
    %p 表示为十六进制,并加上前导的0x

    17、Go routine and channel

    https://blog.csdn.net/skh2015java/article/details/60330785

    18、生成时间戳

    startTime = time.Now()    ——> time.Now().Sub(startTime) 

    19、Go 语言标准库

    https://studygolang.com/pkgdoc

    20、Map Chan变量赋值+判断

    如果map查找、类型断言或Chan接收出现在赋值语句的右边,它们都可能会产生两个结果,有一个额外的布尔结果表示操作是否成功:

    v, ok := m[key]    // map lookup
    v, ok := x.(T)     // type assertion        
    v, ok := <-ch    // channel receive

    21、Log模块

      https://studygolang.com/articles/9184

    22、遍历array或Slice的三种方式

    arr3 := [...]int{2, 4, 6, 8, 10}
    
    // 三种遍历数组的方式
    for i:=0; i<len(arr3); i++ {
        fmt.Println(arr3[i])
    }
    
    for i := range arr3 {
        fmt.Println(arr3[i])
    }
    
    for i, v := range arr3 {
        fmt.Println(i, v)
    }

    23、生成随机数

    生成任意随机数

    rand.Int()    //生成一个随机int类型
    rand.Int31()    //生成一个随机int32类型
    rand.Int63()    //生成一个随机int64类型

    生成指定区间的随机数

    //尾数带n的版本则生成[0,n)的随机数。
    // 该函数设置随机种子
    // 若不调用此函数设置随机种子,则默认的种子值为1,由于随机算法是固定的,
    // 如果每次都以1作为随机种子开始产生随机数,则结果都是一样的,因此一般
    // 都需要调用此函数来设置随机种子,通常的做法是以当前时间作为随机种子
    // 以保证每次随机种子都不同,从而产生的随机数也不通
    
    func main() {
        rand.Seed(time.Now().Unix())
        for i:=0; i<10; i++ {
            fmt.Println(rand.Intn(100))
        }
    }

    24、数组和Slice的传递问题

    arr1 := [...]int{10,20,30}
    
    // 数组是值传递
    arr2 := arr1
    arr2[0] = 200
    
    // slice是引用传递,slice本身没有数据,是对底层array的一个view
    arr3 := arr1[:]
    arr3[0] = 100
    
    fmt.Println(arr1, arr2, arr3)

    输出结果:[100 20 30] [200 20 30] [100 20 30]

    25、Go包管理

    github地址:https://github.com/gpmgo/gopm

    install go package manager:

      go get -u github.com/gpmgo/gopm

    usage:

      gopm get -g -v golang.org/x/text

    也可以直接在github上下载

    git clone https://github.com/rcrowley/go-metrics /Users/shongbing/go/src/github.com/rcrowley/go-metrics

    26、golang 包依赖管理 godep 使用

    https://studygolang.com/articles/9877

  • 相关阅读:
    Java源码赏析(四)Java常见注解
    Java源码赏析(三)初识 String 类
    Java源码赏析(二)Java常见接口
    Java源码赏析(一)Object 类
    Java随谈(二)对空指针异常的碎碎念
    Java随谈(一)魔术数字、常量和枚举
    jquery.validate 使用--验证表单隐藏域
    jquery.validate使用
    jquery.validate使用
    jquery.validate使用
  • 原文地址:https://www.cnblogs.com/vincenshen/p/9235897.html
Copyright © 2011-2022 走看看