• 【GO】GO语言学习笔记二


    基本类型:

    布尔型:boolean

    整型:int8,byte,int16,int,uint,uintptr等

    浮点型:float32,float64

    复数类型:complex64,complex128

    字符串型:string

    字符型:rune

    错误类型:error

    复合类型:

    指针:pointer

    数组:array

    切片:slice

    字典:map

    通道:chan

    结构体:struct

    接口:interface

    1、布尔型,与其他语言中的布尔型一样

    2、整型:

    a、类型表示

    需要注意的是,int和int32在Go语言里被认为是两种不同的类型,编译器也不会帮你自动 做类型转换,比如以下的例子会有编译错误:
    var value2 int32
    value1 := 64 // value1将会被自动推导为int类型 value2 = value1 // 编译错误

    编译错误类似于:
    cannot use value1 (type int) as type int32 in assignment。 使用强制类型转换可以解决这个编译错误:
    value2 = int32(value1) // 编译通过 当然,开发者在做强制类型转换时,需要注意数据长度被截短而发生的数据精度损失(比如
    将浮点数强制转为整数)和值溢出(值超过转换的目标类型的值范围时)问题。

    b、数值运算

    Go语言支持下面的常规整数运算:+、、*、/和%。加减乘除就不详细解释了,需要说下的 是,% 和在C语言中一样是求余运算,比如:

    5%3 // 结果为:2 

    c、比较运算

    Go语言支持以下的几种比较运算符:>、<、==、>=、<=和!=。这一点与大多数其他语言相 同,与C语言完全一致。

      下面为条件判断语句的例子:
    
    i, j := 1, 2 if i == j {
            fmt.Println("i and j are equal.")
        }
    

    两个不同类型的整型数不能直接比较,比如int8类型的数和int类型的数不能直接比较,但
    各种类型的整型变量都可以直接与字面常量(literal)进行比较,比如:

    var i int32
    var j int64
    i, j = 1, 2
    if i==j{ // 编译错误 fmt.Println("i and j are equal.")
    }
    if i==1||j==2{// 编译通过 fmt.Println("i and j are equal.")
    }
    

    d、位运算

    Go语言的大多数位运算符与C语言都比较类似,除了取反在C语言中是~x,而在Go语言中 是^x。

    3、浮点型:

    浮点型用于表示包含小数点的数据,比如1.234就是一个浮点型数据。Go语言中的浮点类型 采用IEEE-754标准的表达方式。
    a、 浮点数表示
    Go语言定义了两个类型float32和float64,其中float32等价于C语言的float类型, float64等价于C语言的double类型。
    在Go语言里,定义一个浮点数变量的代码如下:

    var fvalue1 float32
    fvalue1 = 12
    fvalue2 := 12.0 // 如果不加小数点,fvalue2会被推导为整型而不是浮点型
    

    对于以上例子中类型被自动推导的fvalue2,需要注意的是其类型将被自动设为float64, 而不管赋给它的数字是否是用32位长度表示的。因此,对于以上的例子,下面的赋值将导致编译 错误:
    fvalue1 = fvalue2
    而必须使用这样的强制类型转换:
    fvalue1 = float32(fvalue2)

    b、浮点数比较
    因为浮点数不是一种精确的表达方式,所以像整型那样直接用==来判断两个浮点数是否相等 是不可行的,这可能会导致不稳定的结果。
    下面是一种推荐的替代方案:

    import "math"
    // p为用户自定义的比较精度,比如0.00001 
    func IsEqual(f1, f2, p float64) bool {   return math.Fdim(f1, f2) < p
    }

    4、复数类型:

    复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示实部(real),一个表示 虚部(imag)。如果了解了数学上的复数是怎么回事,那么Go语言的复数就非常容易理解了。

    a、复数表示 复数表示的示例如下: 

    var value1 complex64
    value1 = 3.2 + 12i  // 由2个float32构成的复数类型  
    value2 := 3.2 + 12i   // value2是complex128类型
    value3 := complex(3.2, 12)  // value3结果同 value2
    

    b、实部与虚部
    对于一个复数z = complex(x, y),就可以通过Go语言内置函数real(z)获得该复数的实 部,也就是x,通过imag(z)获得该复数的虚部,也就是y。
    更多关于复数的函数,请查阅math/cmplx标准库的文档。

    5、字符串:

    Go语言中字符串的声明和初始化非常简单,举例如下:

    var str string // 声明一个字符串变量
    str = "Hello world" // 字符串赋值
    ch := str[0] // 取字符串的第一个字符
    fmt.Printf("The length of \"%s\" is %d \n", str, len(str)) fmt.Printf("The first character of \"%s\" is %c.\n", str, ch)
    输出结果为:
        The length of "Hello world" is 11
        The first character of "Hello world" is H.
    

    字符串的内容可以用类似于数组下标的方式获取,但与数组不同,字符串的内容不能在初始 化后被修改,比如以下的例子:
    str := "Hello world" // 字符串也支持声明时进行初始化的做法

    str[0] = 'X' // 编译错误
    编译器会报类似如下的错误:

    cannot assign to str[0]

    a、字符串操作

    平时常用的字符串操作如表2-3所示。

    更多的字符串操作,请参考标准库strings包。

    b、字符串遍历

    Go语言支持两种方式遍历字符串。一种是以字节数组的方式遍历:

    str := "Hello,世界"
    n := len(str)
    for i := 0; i < n; i++ {
    ch := str[i] // 依据下标取字符串中的字符,类型为byte
            fmt.Println(i, ch)
    }
    

    另一种是以Unicode字符遍历:

    str := "Hello,世界"
    for i, ch := range str {
    fmt.Println(i, ch)//ch的类型为rune }
    

    以Unicode字符方式遍历时,每个字符的类型是rune(早期的Go语言用int类型表示Unicode 字符),而不是byte。

    6、字符类型:

    在Go语言中支持两个字符类型,一个是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值;另一个是rune,代表单个Unicode字符。 关于rune相关的操作,可查阅Go标准库的unicode包。另外unicode/utf8包也提供了
    UTF8和Unicode之间的转换。 出于简化语言的考虑,Go语言的多数API都假设字符串为UTF-8编码。尽管Unicode字符在标准库中有支持,但实际上较少使用。

    未完待续。。。

      

      

      

      

      

      

      

      

  • 相关阅读:
    第一个爬虫和测试
    数学规律
    自定义手绘
    tqqqy的成绩表
    Linux常用命令-netstat
    文档查看命令 cat more less tail head
    Linux三剑客-常用命令
    IO多路复用模型
    redis 的线程模型
    为什么需要缓存?
  • 原文地址:https://www.cnblogs.com/NicholasFugui/p/6206035.html
Copyright © 2020-2023  润新知