知行合一
Choose a quality life!

 

一,基本数据类型

  基本的整型,浮点型,布尔型,字符串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 \n", a)  // 10
	fmt.Printf("%b \n", a)  // 1010  占位符%b表示二进制
 
	// 八进制  以0开头
	var b int = 077
	fmt.Printf("%o \n", b)  // 77
 
	// 十六进制  以0x开头
	var c int = 0xff
	fmt.Printf("%x \n", c)  // ff
	fmt.Printf("%X \n", 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\n", math.Pi)    // 按照默认宽度和精度输出整型
        fmt.Printf("%.2f\n", 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:\Code\lesson1\go.exe"     将路径的双引号进行转义

  多行字符串:

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

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

package main

import "fmt"

var s1 string = `abc
def
ghi
`
func main(){
	fmt.Println(s1)   
}
//  abc    一个\n占一个字节长度
    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/

  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2019-05-20 14:58  小米没吃饭  阅读(516)  评论(0编辑  收藏  举报