Go语言学习(三)| 基础数据类型

mervyn 2018年6月26日12:39:10编程语言 GoGo语言学习(三)| 基础数据类型已关闭评论882

目录

Go 基础数据类型:文章源自编程技术分享-https://mervyn.life/cf4fb862.html

  • 布尔型
  • 数字类型
  • 字符串类型
  • 错误类型

布尔型 bool

布尔型的值只能为 truefalse , 例:文章源自编程技术分享-https://mervyn.life/cf4fb862.html

var v1 bool = true
v1 := (2 > 1)   //这种方式会自动推导为 bool 类型

布尔可以做3种逻辑运算,&& || !文章源自编程技术分享-https://mervyn.life/cf4fb862.html

支持的比较操作符:< > == != <= >=文章源自编程技术分享-https://mervyn.life/cf4fb862.html

NOTE 布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。文章源自编程技术分享-https://mervyn.life/cf4fb862.html

数字类型

整型

整型类型主要为:文章源自编程技术分享-https://mervyn.life/cf4fb862.html

  • int8 有符号 8 位整型 ( -128 到 127 )
  • uint8 无符号 8 位整型 ( 0 到 255 )
  • byte 类似 uint8 但不属于同一个类型
  • int16
  • uint16
  • uint32 无符号 32 位整型
  • uint64 无符号 64 位整型
  • int32
  • rune 类似 int32 用UTF-8编码。例如循环字符串获取实际字符时就需要使用 rune 类型
  • int64
  • uint 32 或 64 位,由硬件决定最大长度
  • int 32 或 64 位,由硬件决定最大长度
  • uintptr 无符号整型,用于存放一个指针

Go语言支持以下的常规整数运算:+ - * / % 。 其中 % 是求余运算。文章源自编程技术分享-https://mervyn.life/cf4fb862.html

5 % 3 //结果为:2

浮点型

浮点数

  • float32 32位浮点数,精确到小数点后7位
  • float64 64位浮点数,精确到小数点后15位
var v1 float32 //声明后默认为 0
v2 := 12.0 //如果不加小数点,v2 会被推导为整型而不是浮点型

浮点数不能直接用 == 来判断两个浮点数是否相等。下面是一种推荐的替代方案:文章源自编程技术分享-https://mervyn.life/cf4fb862.html

import "math"
const MIN = 0.000001
// MIN 为用户自定义的比较精度
func IsEqual(f1, f2 float64) bool {
    return math.Dim(f1, f2) < MIN
}

复数

  • complex64 32 位实数和虚数
  • complex128 64 位实数和虚数

下边为声明 complex64 变量的例子:文章源自编程技术分享-https://mervyn.life/cf4fb862.html

func main() {
    var v1 complex64 //声明后默认为(0+0i)
    v1 = 3.2 + 12i
    v2 := 3.2 + 12i
    v3 := complex(3.2, 12)
    fmt.Println(v1, v2, v3)//输出结果为:(3.2+12i) (3.2+12i) (3.2+12i)
}

字符串类型

字符串在Go中是 UTF-8 的由双引号(")或反引号(\\)包裹的字符序列(类型为string)。如果使用单引号则表示一个字符(UTF-8编码)
一旦给变量赋值,字符串就不能修改了。如果想要修改可使用如下方式:文章源自编程技术分享-https://mervyn.life/cf4fb862.html

package main

import "fmt"

func main() {
    s := "Hello, world!"
    c := []byte(s) //将字符串转换为[]byte类型
    c[0] = 'c'
    s2 := string(c) //再转换为string
    fmt.Printf("%s\n", s2)
}

或者使用另外一种方式:文章源自编程技术分享-https://mervyn.life/cf4fb862.html

package main

import "fmt"

func main() {
    s := "hello, world!"
    fmt.Printf("%c\n", s[0]) //输出h,注意输出时的格式为c
    s = "c" + s[1:]          // 字符串虽不能更改,但可进行切片操作
    fmt.Printf("%s\n", s)    //输出结果:cello, world!
}

连接两个字符串文章源自编程技术分享-https://mervyn.life/cf4fb862.html

package main

import "fmt"

func main() {
    str := "Starting part " +
    "Ending part"
    fmt.Println(str)
}

NOTE 在循环中使用加号 + 拼接字符串并不是最高效的做法,更好的办法是使用函数 strings.Join() ,使用字节缓冲( bytes.Buffer )拼接更加给力!文章源自编程技术分享-https://mervyn.life/cf4fb862.html

字符类型 rune

在Go语言中支持两个字符类型,要给是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值;另一个是rune,代表单个Unicode字符。
关于rune相关操作,可查阅Go标准库的unicode包。另外unicode/utf8包也提供了UTF-8和Unicode之间的转换。文章源自编程技术分享-https://mervyn.life/cf4fb862.html

字符串遍历

Go语言支持两种方式遍历字符串。文章源自编程技术分享-https://mervyn.life/cf4fb862.html

  • 以字节数组的方式遍历
  • 以Unicode字符遍历

例:文章源自编程技术分享-https://mervyn.life/cf4fb862.html

package main

import "fmt"

func main() {
    str := "Hello, 你好, 世界"
    length := len(str)

    //以字节数组的方式遍历
    for i := 0; i < length; i++ {
        ch := str[i]
        fmt.Println(i, ch)
    }

    //以Unicode字符遍历
    for i,ch := range str {
        fmt.Println(i,ch)//ch的类型为rune
    }
}

NOTE 以Unicode字符方式遍历时,每个字符的类型是rune,而不是byte。文章源自编程技术分享-https://mervyn.life/cf4fb862.html

错误类型 error

error类型本身就是一个预定义好的接口,里面定义了一个method。文章源自编程技术分享-https://mervyn.life/cf4fb862.html

type error interface {
    Error() string
}

生成一个新的error并返回,一般有以下几种处理方式:文章源自编程技术分享-https://mervyn.life/cf4fb862.html

package main

import (
    "errors"
    "fmt"
)

type CustomError struct {
    infoa string
    infob string
    Err   error //声明后默认为nil
}

func (cerr CustomError) Error() string {
    errorinfo := fmt.Sprintf("infoa : %s , infob : %s , original err info : %s ", cerr.infoa, cerr.infob, cerr.Err.Error())
    return errorinfo
}

func main() {
    //方法一:采用errors包的New方法 返回一个err的类型
    var err error
    err = errors.New("this is a new error")
    //由于已经实现了error接口的方法 因此可以直接调用对应的方法
    fmt.Println(err.Error())    //输出结果:error new

    //方法二: 采用fmt.Errorf 将string信息转化为error信息 并返回
    err = fmt.Errorf("%s", "the error test for fmt.Errorf")
    fmt.Println(err.Error())    //输出结果:fmt.Errorf

    //方法三: 采用自定义的方式实现一个error的 一个duck 类型
    err = &CustomError{
        infoa: "err info a",
        infob: "err info b",
        Err:   errors.New("test custom err"),
    }

    //输出结果:infoa : err info a , infob : err info b , original err info : custom err
    fmt.Println(err.Error())
}
文章源自编程技术分享-https://mervyn.life/cf4fb862.html
weinxin
我的微信公众号
微信扫一扫
mervyn
go中string和int、floatx相互转换 Go

go中string和int、floatx相互转换

日常开发中经常用到字符串和数字之间的相关转换,下面总结下常用的类型转换方式。 字符串转数字 string转int i, err := strconv.Atoi(str) if err != nil{ ...
python多版本及依赖包管理 Python

python多版本及依赖包管理

本文主要讲述如何通过 pyenv 来管理不同版本的 python ,以及如何使用 Pipenv 在同一个python版本实现项目之间依赖包的隔离。 pyenv Linux下安装 curl https:...
PHP 将16进制字符转换成汉字 PHP

PHP 将16进制字符转换成汉字

项目代码提供给外部的api,有些参数是中文的。发现有些客户在请求接口的时候,参数的值被转成了16进制,从而导致接口无法正常解析。 此时可以采用如下方法进行转移: <?php $param = &...
Go 方法指针接收者和值接收者 Go

Go 方法指针接收者和值接收者

Go 语言可以给自定义的类型添加一个方法。这里的方法其实也是函数,跟函数的区别在于在 func 关键字和函数名中间增加了一个参数,可以认为该类型也作为了参数传递入了函数中,例: package mai...