Golang入门2-数据类型

言淦 · · 674 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

环境: go1.11.2 linux/amd64(Ubuntu 18.04)

注:本文内容主要来自Golang中文社区
mp.weixin.qq.com/s/xmV3yWsDc…
mp.weixin.qq.com/s/h2mV1zZ_C…

前菜

因为数据类型跟变量息息相关,所以这里会先讲述Golang变量的几种声明方式。

1.var name type 比如 var i int, 表示声明了一个int类型的变量,名字为 i。这时候只是声明,并没有赋值,如果变量没有赋值,Go会自动进行赋值,而int类型的默认值为0。

2.var name type = value 第一种方式的进化,在声明变量的时候便赋予了初始值

3.var name = value(类型推断) 比如 int i = 8, 此时虽然没有声明i的类型,但是Go会自动识别 i 的类型

4.var name1, name2 type = value1, value2 声明多个变量

5.name := value(简短声明) 这是Golang的一种典型声明方式, 例如 i := 1。这种方式有三个要求,一是要求左边的变量必须被赋值,二是要求左边变量至少有一个是尚未声明的,三是这种方式只支持函数体内使用,其他范围必须用var

// 左边的变量必须被赋值
func main(){
	name, age := "your name"  // assignment mismatch: 2 variable but 1 values
	fmt.Println("my name is", name, "age", age)
}

// 左边变量至少有一个是尚未声明的
func main(){
	a, b := 20, 30
	fmt.Println("a is ", a, "b is", b)
	// 因为c未声明,所以运行成功
	b, c := 40, 50
	fmt.Println("b is ", b, "c is", c)
}
复制代码

在Golang中,公有变量和私有变量也值得注意,其中,首字母大写的变量(包括函数)是公有变量,可以被其他模块引用; 首字母小写的变量是私有变量,只能在本模块引用

package main

import (
	"fmt"
	"math"
)
func main() {
	fmt.Println(math.Pi) // 3.141592653589793
}
// 错误示范
func main() {
	fmt.Println(math.pi) // cannot refer to unexported name math.pi
}

复制代码

正餐

Golang有非常多的类型,这里只会涉及到 数字类型字符串类型

数字类型

Go的数字类型有很多,具体有以下类型:

  • int8, int16, int32, int64, int
  • uint8, uint16, uint32, uint64, uint
  • float32, float64
  • complex64, complex128
  • byte
  • rune

有符号整型 int8:表示 8 位有符号整型(00000000 ~ 11111111, 第一位是符号位)
大小:8 位
范围:-128~127

int16:表示 16 位有符号整型
大小:16 位
范围:-32768~32767

int32:表示 32 位有符号整型
大小:32 位
范围:-2147483648~2147483647

int64:表示 64 位有符号整型
大小:64 位
范围:-9223372036854775808~9223372036854775807

int:根据不同的底层平台自动选择 32 或 64 位整型。除非对整型的大小有特定的需求,否则你通常应该使用 int 表示整型。

无符号整型 uint8:表示 8 位无符号整型
大小:8 位
范围:0~255

uint16:表示 16 位无符号整型
大小:16 位
范围:0~65535

uint32:表示 32 位无符号整型
大小:32 位
范围:0~4294967295

uint64:表示 64 位无符号整型
大小:64 位
范围:0~18446744073709551615

uint:根据不同的底层平台,选择 32 或 64 位无符号整型。
大小:在 32 位系统下是 32 位,而在 64 位系统下是 64 位。
范围:在 32 位系统下是 0~4294967295,而在 64 位系统是 0~18446744073709551615。

浮点型
float32:32 位浮点数
float64:64 位浮点数

复数类型
complex64:实部和虚部都是 float32 类型的的复数。
complex128:实部和虚部都是 float64 类型的的复数。

复数类型的实部和虚部应该是相同类型,也就是 float32 或 float64。
如果实部和虚部都是 float32 类型,则函数会返回一个 complex64 类型的复数。如果实部和虚部都是 float64 类型,则函数会返回一个 complex128 类型的复数。

其他数字类型
byte 是 uint8 的别名。创建这个类型是为了区分传过来的参数是位类型还是数字类型
rune 是 int32 的别名。

nil: pointer, channel, func, interface, map, or slice 类型的0值, 也只能用于这些类型

package main

import (
	"fmt"
	"unsafe"
)

func main()  {
	// unsafe.Sizeof用于查看变量的字节数
	var a uint8 = 124
	var b uint16 = 124
	var c uint32 = 124
	var d uint64 = 124
	var e int = 2147483649

	var g int8 = 124
	// var f int8 = -156  // 这样赋值会报错, 因为int8的范围是-128~127, 所以赋值为-156会溢出
	var i int16 = 124
	var k int32 = 124
	fmt.Println("sizea:", unsafe.Sizeof(a))  // 占1个字节
	fmt.Println("sizeb:", unsafe.Sizeof(b))  // 2
	fmt.Println("size:", unsafe.Sizeof(c))  // 4
	fmt.Println("size:", unsafe.Sizeof(d))  // 8
	fmt.Println("size:", unsafe.Sizeof(e))  // 我的机器是64位,所以是8字节

	//fmt.Println("size:", unsafe.Sizeof(f))  // 1
	fmt.Println("size:", unsafe.Sizeof(g))  // 1
	fmt.Println("size:", unsafe.Sizeof(i))  // 2
	fmt.Println("size:", unsafe.Sizeof(k))  // 4
}

复制代码

字符串类型

由于和其他语言相比,字符串在 Go 语言中有着自己特殊的实现,主要有以下几个特点。

  • 1.字符串是字节的集合。
  • 2.单引号和双引号代表的意义不同, 单引号是rune类型,双引号才是字符串类型。
  • 3.Go 中的字符串是兼容 Unicode 编码的,并且使用 UTF-8 进行编码。

获取字符串长度的几种方法:

  • 使用 bytes.Count() 统计
  • 使用 strings.Count() 统计
  • 将字符串转换为 []rune 后调用 len 函数进行统计
  • 使用 utf8.RuneCountInString() 统计
str:="HelloWord"
 
l1:=len([]rune(str))
 
l2:=bytes.Count([]byte(str),nil)-1)
 
l3:=strings.Count(str,"")-1
 
l4:=utf8.RuneCountInString(str)
复制代码

单引号和双引号的区别?
在Go中,双引号是用来表示字符串string,其实质是一个byte类型的数组。单引号表示rune类型。还有一个反引号, 支持多行文本,但不支持转义。

字符串的格式化
studygolang.com/articles/10…

类型转换

// 1.数字类型转字符串类型主要有三种方法: fmt.Sprint、strconv.Itoa和strconv.FormatInt。
// 其中, fmt.Sprintf效率是最低的, 由于strconv.Itoa封装了strconv.FormatInt, 所以效率在第二位, strconv.FormatInt效率最高。

// uint32 to string
var n uint32 = 42
string := fmt.Sprint(n)

var n uint32 = 42
string := strconv.FormatUint(uint64(n), 10)

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

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

// string to int
i, err := strconv.Atoi(str)
if err == nil {
  fmt.Printf(“i: %v\n”,i)
}

// string to int64
i64,err := strconv.ParseInt(str, 10, 64)
if err == nil {
  fmt.Printf(“i64: %v\n”,i64)
}
复制代码

获取变量类型

studygolang.com/articles/10…

参考

官网: docscn.studygolang.com/ref/spec#St…

GCTT出品 Go系列教程 —— 14. 字符串: mp.weixin.qq.com/s/lneAvSuJn…

golang数字转字符串方法: blog.csdn.net/wangzhezhil…


有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:言淦

查看原文:Golang入门2-数据类型

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

674 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传