Golang——基础数据类型

基础数据类型:

  • 整型:byte、int、int8、int16、int32、int64、unit、uint16、uint3、uint64等
  • 浮点型:float32、float64
  • 复数类型:complex64、complex128
  • 布尔类型:bool
  • 字符串:string
  • 字符类型:rune
  • 错误类型:error

复合数据类型:

  • 指针(pointer)
  • 数组(array)
  • 切片(slice)
  • 字典(map)
  • 通道(channel)
  • 结构体(struct)
  • 接口(interface)

基本数据类型

整型

有符号:int8 int16 int32 int64
无符号:unit8 uint16 uint32 uint64

unit8byte

int16对应c语言中的short型 ,int64对应c语言中的long型。

int:自动匹配os,os是32位就是int32,os是64位就是int64

len():获取对象的长度,返回int

package main

import "fmt"

func main() {
        //十进制
    var a int = 10
    fmt.Printf("%d \n", a)   //10
    fmt.Printf("%b \n", a)   //1010  占位符%b表示二进制

    //八进制
    var b int= 077
        fmt.Printf("%d \n", b)   //63
    fmt.Printf("%o \n", b)   //77

    //十六进制
    var c int= 0xff
    fmt.Printf("%x \n", c)   //ff
    fmt.Printf("%X \n", c)   //FF

    //变量的内存地址
    fmt.Printf("%p \n", &a)  //0xc000014080 
}

math.Nan(),跟谁(包括自己)都不相等

浮点型

遵循IEEE 754标准
float32 :最大范围为3.4e38,用常量math.MaxFloat32
float64:最大范围为1.8e308,用常量math.MaxFloat64
float32的有效bit位只有23个,其它的bit位用于指数和符号;当大于23bit能表达的范围时,float32表示将会出现误差。

package main

import (
    "fmt"
    "math"
)

func main() {
    var a float32 = 2.34
    fmt.Printf("%f \n", a)           //2.340000
    fmt.Printf("%f \n", math.Pi)     //3.141593
    fmt.Printf("%0.2f \n", math.Pi)  //3.14
}

复数类型

complex64 : 实部和虚部分别是32位
complex128 : 实部和虚部分别是64位

package main

import "fmt"

func main() {
    var c1 complex64
    c1 = 1 + 2i
    fmt.Println(c1)     //(1+2i)
    var c2 complex128
    c2 = 3 + 4i
    fmt.Println(c2)     //(3+4i)
}

布尔类型

bool:只有truefalse
注意:
(1)默认值是false
(2)不允许将整型强制转为布尔型;
(3)不参与数值运算,不与其它类型进行转换;

package main

import "fmt"

func main() {
    var b bool
    b = 1         //编译报错
    b = bool(1)   //编译报错

    var bb bool
    fmt.Println(bb)
    bb = true
    fmt.Println(bb)
    bb = (1 == 0)  //编译正确
    fmt.Println(bb)
}

字符串

内部实现使用UTF-8编码,用双引号("")

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

转移字符(\)
\r \n \t ' " \

var s string = "str = \"c:\\users\\temp\""
fmt.Println(s)    //str = "c:\users\temp"

多行字符串,用反引号(``)
反引号间换行认为字符串中的换行;但是反引号间所有的转义字符均无效,文本按照原样输出

var multiStr  = `这是
多
"不需要转移"
行
`

常用方法
求长度:len(str)
拼接字符串:+或者fmt.Sprintf
分割:string.Split
判断是否包含:strings.Contains
前缀/后缀判断:strings.HasPrefix,strings.HasSuffix
字串出现的位置:strings.Index(),strings.LastIndex
合并操作:strings.Join(a[] string, sep string)

package main

import "fmt"
import "strings"

func main() {
    s1 := "Hello "
    //求长度
    fmt.Println(len(s1))   //6

    //连接
    s2 := "Go"
    // s3 := s1 + s2
    s3 := fmt.Sprintf("%s----%s", s1, s2)
    fmt.Println(s3)   //Hello ----Go

    //分割
    s4 := strings.Split("Hello Ha Hwx", "H")
    fmt.Println(s4)   //[ ello  a  wx]

    
    s5 := "Hello haha"
    //是否包含
    fmt.Println(strings.Contains(s5, "Ha"))   //false
    //判断前缀
    fmt.Println(strings.HasPrefix(s5, "He"))  //true
    //判断后缀
    fmt.Println(strings.HasSuffix(s5, "ha"))  //true

    //字串出现位置
    s6 := "Hello Apple App"
    fmt.Println(strings.Index(s6, "App"))      //6
    fmt.Println(strings.LastIndex(s6, "App"))  //12

    //合并
    s7 := []string{"a", "b", "c", "d"}
    fmt.Println(strings.Join(s7, "-"))      //a-b-c-d

}

字符类型:byte和rune类型

字符有两种:
(1)uint8类型,或者叫byte型,代表了ASCII码的一个字符;
(2)rune类型,代表一个UTF-8字符;

当需要出来中文、日文或其它复合字符时,需要用到rune类型。rune类型实际是一个int32,通过reflect.Type可看到。

在类型推导时候,默认是rune类型。byte类型需要强制转换。

package main

import "fmt"

func main() {
    s1 := "Golang"
    c1 := 'G' //1个字节(8位)
    fmt.Println(s1, c1)   //Golang 71
    fmt.Printf("%c", c1)   //Golang G

    s2 := "中国"
    c2 := '中'  //UTF-8编码下一个中文是3个字节
    fmt.Println(s2, c2)   //中国 20013

    s3 := "hello冬雪"
    fmt.Println(len(s3))    //11

    //遍历字符串
    for i := 0; i < len(s3); i++{
        fmt.Printf("%c\n", s3[i])   //都成乱码了
    }

    //for range循环,按照rune类型去遍历
    for k,v := range s3{
        fmt.Printf("%d - %c\n", k, v)
    }
    // 0 - h
    // 1 - e
    // 2 - l
    // 3 - l
    // 4 - o
    // 5 - 冬
    // 8 - 雪

}

修改字符串

字符串是值类型,赋值之后不可修改
要修改字符串,需要先将其转换成[]rune[]byte,完成后再转换为string。无论哪种转换,都会从新分配内存,并复制字节数组。

s1 := "small"
byteS1 := []byte(s1)
byteS1[0] = 'a'
fmt.Println(s1,string(byteS1))  //small amall

s2 := "冬雪"
runeS2 := []rune(s2)
runeS2[1] = '冬'
fmt.Println(s2,string(runeS2))  //冬雪 冬冬

类型转换

只有强制类型转换,没有隐式转换。

T(表达式)

T是要转换的类型。
表达式包括变量、复杂算子和函数返回值等。

s1 := "small"
byteS1 := []byte(s1)
byteS1[0] = 'a'
fmt.Println(s1,string(byteS1))  //small amall
//强制类型转换
s1 = string(byteS1)
fmt.Println(s1)  //amall

类型转换包strconv

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352