Golang基础数据类型

前言

程序=数据+指令(算法)所以数据结构就是帮我们 解决  如何在程序开发过程  定义和存储要用到的数据;

Go语言的数据类型拥有丰富的数据类型

 

整型

.main.go:8:21: constant 1000 overflows uint8

在Python里面定义1个数字类型的变量,无需考虑系统底层内存存储这个变量 需要开销多大 存储空间(位),因为Python解释器自动计算、分配;在Go里面不行!

计算机只认识0、1,所谓有符号和无符号就是 计算机到底需要分配多大的存储空间(位/字节)来存储这些数字。

有符号整型:计算机使用第0位表示数字的 +正 -负性质,其他位用来表示数字

无符号整型:计算机使用全部的位 来表示数字

综上所述:

有符号整型:表示数字的位 比无符号少了1位,所以无符号整型可表示的正数数字范围更大

无符号整型:没有符号位所以无法表示 负数

 

有符号整型:

 

int8、int16、int32、int64

无符号整型:

uint8、uint16、unit32、uint64

 int、uint、rune、byte

 

在Go语言中数字的默认数据类型是int类型,也就是有符号整型,如果是32的操作系统就是int32如果是64位操作系统就是int64

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	var n1 = 100
	//n1的数据类型:int n1占用的字节数是8我的电脑是64位所以就是 int64 8位=1字节=8字节
	fmt.Printf("n1的数据类型:%T n1占用的字节数是%d 
", n1, unsafe.Sizeof(n1))
	//在程序运行中,尽量使用占用空间减少的数据类型 比如年龄的数字范围1-200足矣,不需要用int64
	var age byte = 19
	println(age)

}

  

整型变量的声明方式

为什么每中编程语言都有数据类型?

就是可以满足我们声明多样化的数据结构变量的需求,我们的程序逻辑可以处理各种各样的变量(数据)时,我们就可以完成更多的功能。

package main
import "fmt"
func main(){
	//方法1:先声明再赋值
	var n1 int32
	n1=10
	//方法2:var 声明时一起赋值
	var n2 int8 =10
	//方法3:简短声明自动推断19为默认为int类型
	n3:=18
	//方法4:int类型强制转换为int16
	var n4=int16(19)
	fmt.Printf("%T,%T,%T,%T",n1,n2,n3,n4)

}

  

浮点型

go语言中默认使用float64 

float32

float64  

package main

import (
	"fmt"
)

func main() {
	var price float32 = 89.12
	fmt.Println(price)

	var num1 float32 = -0.000089
	var num2 float64 = -78909656.09
	fmt.Println(num1, num2)

	//float64标识的精度要不 float32 更精确
	var num3 float32 = -123.0000091
	var num4 float64 = -123.0000091

	fmt.Println(num3, num4)
	var n1 = 3.1444
	fmt.Printf("%T", n1) //默认为float64

}

  

 

复数

coplex128

complex64

布尔值

Go里面的布尔值不能像Python那样和0和1做转换

true

false

字符串

Go的字符串由Utf-8编码,不能修改,1个汉字占用4个字节、1个英文字母占用1个字节的存储空间。

因为go使用rune(1个int32类型的数字) 表示中文字符,使用byte(1个uint8类型的数字)表示英文。

Python字符串的index方法:

a="1111"
print((a.index("2")))

#找不到指定的元素Python报错:ValueError: substring not found

Golang字符串中的strings.index()方法:

package main

import (
	"fmt"
	"strings"
)

func main() {
	testString := "Hello"
	index := strings.Index(testString,"W")
	fmt.Println(index)//找不到指定元素返回-1
}

practice

自定义1个string的split方法

package main

import (
	"fmt"
	"strings"
)

func main() {
	str1 := "123a456a789"
	sep := "a"
	var ret []string
	//a的index
	index := strings.Index(str1, sep)
	//知道字符串中不包含a也就是index=-1为止
	for index >= 0 {
		//a位置之前的部分:123
		ret = append(ret, str1[:index])
		//a位置之后的部分:456a789
		str1 = str1[index+1:]
		index = strings.Index(str1, sep)
	}
	ret = append(ret, str1)
	fmt.Println(ret)

}

  

字符串相关操作

go中字符串相关的操作的API都封装在strings包中

package main

import (
	"fmt"
	"strings"
	"unicode"
)

func main() {
	s1 := "D:\goproject\src"
	//字符相关操作
	//字符串长度
	fmt.Println(len(s1))

	//字符串拼接
	FirstName := "Martin"
	LastName := "Zhang"
	FullName := FirstName + LastName
	fmt.Println(FullName)
	FullName2 := fmt.Sprintf("%s%s", LastName, FirstName)
	fmt.Println(FullName2)

	//字符串分割
	s3 := "D:\goproject\src"
	ret := strings.Split(s3, "\")
	fmt.Println(ret)
	//包含
	fmt.Println(strings.Contains(s3, "D"))

	//判断字符串 的开头和结尾判断
	fmt.Println(strings.HasPrefix(s3, "D"))
	fmt.Println(strings.HasSuffix(s3, "src"))

	//判断字符在字符串中的index
	s2 := "abcdeb"
	fmt.Println(strings.Index(s2, "b"))
	fmt.Println(strings.LastIndex(s2, "b")) //最后1次出现的位置

	//字符串拼接
	s4 := "D:\goproject\src"
	ret4 := strings.Split(s4, "\")
	s5 := strings.Join(ret4, "/")
	fmt.Println(s5)

	//字符串表里
	//字符:组成字符串的每1个元素 我们称之为字符,在go语言里通过''单引号来定义字符
	//在go语言里字符分为2种:1种是byte 1种是rune
	//byte:给ascii 编码的字符起的别名
	//rune:给Unicode编码的字符起的别名
	var c1 byte = 'c'
	var c2 rune = '中'
	fmt.Printf("c1:%T c2:%T
", c1, c2)
	s6 := "hello 张根"
	//for 循环 按照1个字节循环(会出现乱码:因为中文和英文占用的字节不一致)
	// for i := 0; i < len(s6); i++ {
	// 	fmt.Printf("%c
", s6[i])
	// }
	//for range 按1个字符循环
	for _, v := range s6 {
		fmt.Printf("%c
", v)

	}

	//字符串修改
	s7 := "白萝卜"
	s8 := []rune(s7) //把字符串强制转换为runne切片就可以修改字符串了
	s8[0] = '红'      //修改第一个字符
	fmt.Println(string(s8))

	//类型转换
	n := 10
	var f float64
	f = float64(n) //整型 转成 float64类型
	fmt.Println(f)
	fmt.Printf("%T
", f) //float64

	//判读数据类型

	s9 := "Hello张根"
	for _, v := range s9 {
		if unicode.Is(unicode.Han, v) {
			fmt.Print(string(v))
		}
	}

}

  

 字符(char)

在Go中有字符的概念,使用单引号表示,需要注意的是,英文字符和中文字符,

Go 使用int 的 数据类型别名的方式来表示字符。其中rune为int32的数据类型别名表示中文byte为uint8的数据类型别名用于表示英文

什么是数据类型别名?

In a nutshell just an other name name data type of Golang by you like way.

。。...

package main

import "fmt"

var c1 byte = 'c'
var c2 rune = '中'

type myInt = int

func main() {
	var n myInt
	n = 100
	fmt.Printf("%T
",n)//%T
 Myint还是int

	fmt.Printf("%T
", c1) //uint8
	fmt.Printf("%T
", c2) //int32

}

  

 

参考

原文地址:https://www.cnblogs.com/sss4/p/12522089.html