zoukankan      html  css  js  c++  java
  • 21天从Java转向Go之第四天——水滴石穿(基本数据)

    Go语言中的数据类型

    • 基础类型

    • 聚合类型

    • 引用类型

    • 接口类型

    基础类型

    数字

    整数

    • 有符号整数
      -- int8 int16 int32 int64 int
    • 无符号整数
      -- uint8 uint16 uint32 uint64 uint
    • int uint 位数取决于编译器32位或64位
    • byte类型 同unit8类型
    • rune类型 同int32类型
    • uintptr ,用于底层编程,大小不明确,足以完整存放指针。

    浮点数

    • float32
    • float64
    • math包 math.IsNaN()

    复数

    • complex64
    • complex128
    	c := complex(1, 2)
    	r := real(c)
    	i := imag(c)
    	fmt.Printf("实部:%f虚部:%f\n",r,i)
    

    字符串

    • 字符串是不可变的字节序列,可以包含任意数据,包括0值字节。文本字符串被解读成按UTF-8的Unicode码点(文字符号)。
    • len(string)函数 返回字节数,使用下标访问,返回得到第i个字符。0《= i <len(s)
    s := "你好,hello 世界 プログラム"
    	fmt.Println("字节数:",len(s))//37
    	fmt.Println("前三个字符:",s[0],s[1],s[2],s[3])// 228 189 160 229
    		fmt.Println(s[len(s)]) //panic: runtime error: index out of range [37] with length 37
    
    
    • 加号(+)连接俩个字符串生成一个新的字符串,+=生成新的字符串
    	s+="123"
    	fmt.Println(s) //你好,hello 世界 プログラム123
    
    • 字符串不可改变,字符串内部的数据不允许修改。不可变意味着两个字符串可以安全地共用同一段底层内存,使得复制任何长度字符串的开销都低廉。
    s[0] = 'L' //编译错误:s[0]无法赋值
    //s[7:]与s共用底层字节数组
    
    • 字符串字面量双引号形式 和 原生字面量`` 原生字符串字面量可以展开多行,唯一特殊处理是回车符会被删除。
    • unicode 囊括了世界上所有文书体系的全部字符,对它们各自赋予一个叫Unicode码点的标准数字。在Go语言中,这些字符记号被称为文字符号(rune)。天然适合保存单个文字符号的数据类型就是int32,为Go所采用;正因如此,rune类型作为int32类型的别名。我们可以将文字符号的序列表示出int32值序列,每个unicode码点的编码长度相同,都是32位。这种编码简单划一,可是因为大多数面向计算机的可读文本是ASCII码,每个字符只需要8位,也会是1个字节,导致了不必要的存储空间消耗,而使用广泛的字符数目也少于65556个,字符用16位就能容纳。我们能作改进吗?
    • UTF-8
      UTF-8以字节为单位对Unicode码点作变长编码。UTF-8是现行的一种Unicode标准,由Go的两位创建者Ken Thompson和Rob Pike发明。每个文字符号用1~4个字节表示,ASCII字符的编码仅占1个字节,其他文书字符的编码是2或3个字节。一个文字符号编码的首字节的高位指明了后面还有多少字节。若最高位是0,标示着它是7位的ASCII码,其文字符号的编码仅占1字节,这就与传统的ACSII码一致。若最高几位是110,则文字符号的编码占用2个字节,第二个字节以10开始。更长的编码以此类推。
      变长编码的字符串无法按下表直接访问第n个字符,然而有时有得,UTF-8换来许多有用的特性。最多追溯3字节,就能定位一个字符的起始位置。UTF-8是前缀编码,因此能从左向右解码而不产生歧义,也无须超前预读。
    • unicode包提供了对单个文字符号的函数
    • unicode/utf8包则提供了按UTF-8编码和解码文字符号的函数。
    package main
    
    import (
    	"fmt"
    	"unicode/utf8"
    )
    
    func main() {
    	s := "你好,hello 世界 プログラム"
    	fmt.Println("字节数:",len(s))//37
    	fmt.Println("前三个字符:",s[0],s[1],s[2],s[3])// 228 189 160 229
    	//fmt.Println(s[len(s)]) //panic: runtime error: index out of range [37] with length 37
    
    	s+="123"
    	fmt.Println(s)
    //s=	``
    //	fmt.Println(s)
    
    	fmt.Println(utf8.RuneCountInString(s)) //返回 string s 中的 UTF-8 编码的码值的个数。
    
    	for i, i2 := range s { //隐式
    		fmt.Println("for range:",i,i2)
    	}
    
    	for i := 0; i < len(s); {
    		inString, size := utf8.DecodeRuneInString(s[i:])  //解码 string s 中第一个 UTF-8 编码序列,返回该码值和长度。
    		i+=size
    		fmt.Println(inString,size)
    		fmt.Println(string(inString))
    	}
    
    	runes := []rune(s)
    	fmt.Println(runes)
    
    	fmt.Println(string(runes))
    }
    
    
    • 4个标准包对字符串操作特别重要 bytes strings strconv unicode

    布尔

    聚合类型

    数组

    结构体

    引用类型

    • 当声明引用类型的变量时,创建的变量被称作标头(header)值。从技术细节上说,字符串也是一种引用类型。每个引用类型创建的标头值是包含一个指向底层数据结构的指针。每个引用类型还包含一组独特的字段,用于管理底层数据结构。因为标头值是为复制而设计的,所以永远不需要共享一个引用类型的值。标头值里包含一个指针,因此通过复制来传递一个引用类型的值的副本,本质上就是在共享底层数据结构。

    指针

    slice

    map

    函数

    通道

  • 相关阅读:
    面向对象的三大特性之继承和多态(20161025)
    面向对象基础和面向对象的三大特性之一:封装(20161024)
    正则表达式和数组(20161023)
    php基础语法(20161021)
    学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)
    CRUD操作(20161017)
    TSQL语句和CRUD(20161016)
    Combine Two Tables
    Second Highest Salary
    Employees Earning More Than Their Managers
  • 原文地址:https://www.cnblogs.com/perkins/p/15608418.html
Copyright © 2011-2022 走看看