zoukankan      html  css  js  c++  java
  • Go语言之基础数据类型__整型浮点型布尔字符串

    一,基本数据类型

      基本的整型,浮点型,布尔型,字符串4种

      还有数组,切片,结构体,函数,map,通道(channel)等6种

    1,整型

      无负号整型:unit8,unit16,unit32,unit64  

      有负号整型:int8,int16,int32,int64

      unit8就是我们熟知的byte型,int16对应C语言里的short型,int64对应C语言里的long型

      特殊整型:

    注意: 在使用int和 uint类型时,不能假定它是32位或64位的整型,而是考虑intuint可能在不同平台上的差异。

    注意事项 获取对象的长度的内建len()函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用int来表示。在涉及到二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int和 uint

      十进制,八进制,十六进制:

      go语言种无法直接定义二进制数,关于八进制和十六进制数的示例如下:

    package main
     
    import "fmt"
     
    func main(){
    	// 十进制
    	var a int = 10
    	fmt.Printf("%d 
    ", a)  // 10
    	fmt.Printf("%b 
    ", a)  // 1010  占位符%b表示二进制
     
    	// 八进制  以0开头
    	var b int = 077
    	fmt.Printf("%o 
    ", b)  // 77
     
    	// 十六进制  以0x开头
    	var c int = 0xff
    	fmt.Printf("%x 
    ", c)  // ff
    	fmt.Printf("%X 
    ", c)  // FF
    }
    

    2,浮点型

       GO语言支持两种浮点型数:float32 和 float64。这两种浮点型数据格式遵循 IEEE 754 标准:

        float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32。

        float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64。

        打印浮点数时,可以使用fmt包配合动词  %f,代码如下:

    package main
    import (
            "fmt"
            "math"
    )
    func main() {
            fmt.Printf("%f
    ", math.Pi)    // 按照默认宽度和精度输出整型
            fmt.Printf("%.2f
    ", math.Pi)  // 按默认宽度,二位精度输出(小数点后的位数)
    }
    

      复数(complex64,complex128)

    package main
    
    import "fmt"
    
    func main(){
    	var c1 complex64
    	c1 = 1 + 2i
    	var c2 complex128
    	c2 = 2 + 3i
    	fmt.Println(c1)     //  (1+2i)
    	fmt.Println(c2)	  //  (1+3i)
    }
    // 复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。
    

    3,布尔值注意:

      Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true(真)false(假)两个值。  

      布尔类型变量的默认值为false

      Go 语言中不允许将整型强制转换为布尔型.

      布尔型无法参与数值运算,也无法与其他类型进行转换。

    4,字符串:

      Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。

      Go 语言里的字符串的内部实现使用UTF-8编码。 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符,

    s1 := "hello"
    s2 := "你好"

    // len()函数表示的是ASCII字符串的长度
    tip1 := "genji is a ninja"
    fmt.Println(len(tip1)) // 16
    tip2 := "忍者"
    fmt.Println(len(tip2)) // 6 go默认用的utf8编码,一个中文占3个字节

    // Unicode 字符串长度使用 utf8.RuneCountInString() 函数。
    fmt.Println(utf8.RuneCountInString("忍者"))                 // 2    万国码统计的是字节的长度
    fmt.Println(utf8.RuneCountInString("龙忍出鞘,fight!")) // 11

      字符串转义符:

      举个例子:

    package main
    import (
    "fmt"
    )
    func main() {
    	fmt.Println("str := "c:\Code\lesson1\go.exe"")
    }
    
    //  str := "c:Codelesson1go.exe"     将路径的双引号进行转义
    

      多行字符串:

      GO语言种要定义一个多行字符串时,就必须使用反引号字符

      反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

    package main
    
    import "fmt"
    
    var s1 string = `abc
    def
    ghi
    `
    func main(){
    	fmt.Println(s1)   
    }
    //  abc    一个
    占一个字节长度
        def
        ghi
    

      字符串的常用操作:可以用切片来取值索引索引也是从0开始

    func main(){
    	tracer := "死神来了, 死神bye bye"
    	comma := strings.Index(tracer, ", ")
    	fmt.Println(comma)                  // 12  拿到中文逗号的索引,int型
    	pos := strings.Index(tracer[comma:], "死神")
    	fmt.Println(pos)			        // 拿到死神的索引,int型
    	fmt.Println(tracer[comma:])         //        , 死神bye bye
    	fmt.Println(tracer[comma+pos:])     //    死神bye bye
    	fmt.Println(comma, pos, tracer[comma+pos:])     //    12 2 死神bye bye
    }

    func main(){
    	tracer := "死神来了, 死神bye bye"
            fmt.Println(len(tracer))                   // 求字符串的长度
    	c0 := fmt.Sprintf("%v,123123",tracer)      // 格式化输出
    	fmt.Println(c0)  // 死神来了, 死神bye bye,123123
    	c1 := strings.Contains(tracer,"死神")        // 返回的是bool类型,需要有变量接受
    	fmt.Println(c1)  //true
    	c2 := strings.Split(tracer,",")	             // 用分隔符对字符串进行分割
    	fmt.Println(c2)                              // 返回的是切分之后的值   [死神来了  死神bye bye]
    	c3 := strings.HasPrefix(tracer,"死神")        // 判断是否以某个字符串开头
    	c4 := strings.HasSuffix(tracer,"死神")	      // 判断是否以某个字符串结尾
    	fmt.Println(c3)  //true
    	fmt.Println(c4)	 //flase
    	c5 := strings.Index(tracer, ", ")           // 找到子串出现的起始索引
    	fmt.Println(c5)  //12
    	c6 := strings.LastIndex(tracer,"死神")      // 找到子串出现的最后索引
    	fmt.Println(c6)  //14
    }
    

      byte和rune之间的互相转换

      go语言的字符有一下两种:

        1,unit8类型,或者叫byte型,代表了ASCII码的一个字符

        2,rune类型,代表一个utf-8字符,rune类型实际是一个int32

    // 遍历字符串
    func traversalString() {
    	s := "hello沙河"
    	for i := 0; i < len(s); i++ { //byte
    		fmt.Printf("%v(%c) ", s[i], s[i])    
                   // 104(h) 101(e) 108(l) 108(l) 111(o) 230(æ) 178(²) 153() 230(æ) 178(²) 179(³) 
    	}
    	fmt.Println()
    	for _, r := range s { //rune
    		fmt.Printf("%v(%c) ", r, r)
                    // 104(h) 101(e) 108(l) 108(l) 111(o) 27801(沙) 27827(河) 
    	}
    	fmt.Println()
    }    
    // 字符串的底层是byte数组,所以可以和 []byte 类型相互转换,所以字符串的长度是由byte字节的长度决定的。rune类型表示utf8字符,一个rune字符由一个或多个byte组成

      修改字符串需要先将其转换成 []rune 或 []byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。

    func main() {
    	s1 := "big"
    	// 强制类型转换
    	byteS1 := []byte(s1)      // 转换为byte类型
    	byteS1[0] = 'p'                // 修改第一个参数
    	fmt.Println(string(byteS1))  // 强制转换为字符串      pig
    
    	s2 := "白萝卜"
    	runeS2 := []rune(s2)       // 转换为rune数组
    	runeS2[0] = '红'		      // 修改rune的0号元素
    	fmt.Println(string(runeS2))    //  强制转换为字符串     红萝卜
    }
    

      类型转换

      go语言中只有强制类型转换,没有隐式类型转换,该语法只能在两个类型之间支持相互转换的时候使用

      强制类型转换的基本语法如下;     T(表达式)       T表示要转换的类型,表达式包括变量,复杂算子和函数返回值等

      比如计算直角三角形的斜边长时使用math包的Sqrt()函数,该函数接收的是float64类型的参数,而变量a和b都是int类型的,

      这个时候就需要将a和b强制类型转换为float64类型。

    func sqrtDemo() {
    	var a, b = 3, 4
    	var c int
    	// math.Sqrt()接收的参数是float64类型,需要强制转换
    	c = int(math.Sqrt(float64(a*a + b*b)))
    	fmt.Println(c)
    }
    

      

      好了,今天的故事就到这了。

      原文作者;沙河小王子https://www.liwenzhou.com/posts/Go/02_datatype/

      

      

     

  • 相关阅读:
    【解决办法】移动硬盘在电脑上显示“本地磁盘”并且出现打不开的情况
    在Windows上搭建Python环境
    Thymeleaf模板的使用
    thymeleaf中的th:remove用法
    AngularJS PhoneCat代码分析
    AngularJS PhoneCat代码分析
    利用java反射调用类的的私有方法--转
    Java Reflection (JAVA反射) --转载
    Eclipse 常用快捷键 (动画讲解)--转载
    三大JavaScript框架对比——AngularJS、BackboneJS和EmberJS
  • 原文地址:https://www.cnblogs.com/laogao123/p/10894175.html
Copyright © 2011-2022 走看看