zoukankan      html  css  js  c++  java
  • 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
    
    }
    

      

     

    参考

  • 相关阅读:
    redis数据类型
    golang的select实现原理剖析
    goroutine的设计与实现
    go语言的duck typing
    go语言的局部变量在堆上还是栈上?
    REDIS学习
    C++11右值引用
    C++自问
    go语言interface学习
    go语言学习(基本数据类型)
  • 原文地址:https://www.cnblogs.com/sss4/p/12522089.html
Copyright © 2011-2022 走看看