3 Go 元素:基本数据类型、变量、常量及类型转换

一、基本数据类型

1.数值类型

有符号整数
  • int //根据系统,32系统就是int32,64位系统就int64
  • int8 // [-128,127]
  • int16 //[-32768,32767]
  • int32 //[-2147483648,2147483647]
  • int64 //[-9223372036854775808,9223372036854775807]
无符号整数
  • uint //与rune互为别名,
  • uint8 //[0,255]
  • uint16 //[0,65535]
  • uint32 //[0,4294967295]
  • uint64 //[0,18446744073709551615]
存放指针的类型

-uintptr //一个可以恰好容纳指针值的无符号整数类型(32系统为uint32,64位系统为uint64)

浮点类型
  • fload32
  • fload64
复数类型
  • complex64
  • complex128

2.布尔类型

  • bool

3.字符及字符串

  • rune //字符类型,uint32别名,go默认用utf8编码,最长utf8编码的字符为4字节,所以采用无符号位的unit32表示字符, (rune == uint32 == [4]byte == 32Bit)
  • string //字符串类型,默认utf8编码通常与字节切片互转[]byte

4.字节

  • byte //这种类型在go编程中很常见,其官方包很多数值传输都使用字节切片[]byte

如没声明类型,go会自动识别:

    //整型
    var v1 = 123

    //浮点型
    var v2 = 3.14

    //字符
    var v3 = '我'

    //字符串
    var v4 = "我是fun"

    //布尔值
    var v5 = false

    //格式化打印
    fmt.Printf("v1变量的类型为%T,值为%v\n", v1, v1)
    fmt.Printf("v1变量的类型为%T,值为%v\n", v2, v2)

    fmt.Printf("v1变量的类型为%T,字符序号为%v,字符为%c,十六进制为%x ,二进制位%b\n ", v3, v3, v3, v3, v3)

    fmt.Printf("v1变量的类型为%T,值为%v\n", v4, v4)
    fmt.Printf("v1变量的类型为%T,值为%v\n", v5, v5)
    
    //Output:
    //v1变量的类型为int,值为123
    //v2变量的类型为float64,值为3.14
    //v3变量的类型为int32,字符序号为25105,字符为我,十六进制为6211 ,二进制位110001000010001
    //v4变量的类型为string,值为我是fun
    //v5变量的类型为bool,值为false

二、变量

1.变量声明及赋值

与其他语言不同,Go的类型声明是后置的

var a int64  //变量类型声明
var b fload64 = 3.14 //变量预赋值
c := “aaa” //未声明变量使用冒等自动类型赋值
a = 2 //已声明变量可直接等号赋值

2.多个变量一并声明、赋值

var a,b int32 //一次声明两个同类型变量
var c,d int32 = 4,5 //一次声明两个同类型变量并赋值

e,f := "aaa",123 //冒等一次赋值两变量,可不同类型


//可将var提取出来
var (
    a int64
    b string
)

三、常量

    //声明常量
    const PI = 3.14

    //声明多个常量
    const (
        LightSpeed  = 30 * 10000
        earthCircle = 40000
    )
    
    //使用iota定义常量
    const (
        MONDAY = iota + 1
        /*自动延用排头兵的表达式,但iota逐一递增*/
        TUESDAY
        WEDNESDAy
        THURSDAY
        FRIDAY
        SATURDAY
        SUNDAY
    )
    
    const (
        USA = (iota + 1) * 1000
        CHINA
        RUSSIA
        BRITAIN
        FRANCE 
    )
    
    fmt.Println(MONDAY, TUESDAY, WEDNESDAy, THURSDAY, FRIDAY, SATURDAY, SUNDAY)
    fmt.Println(USA, CHINA, RUSSIA, BRITAIN, FRANCE)

    
    Output:
    1 2 3 4 5 6 7
    1000 2000 3000 4000 5000

四、枚举

//这种写法可以让值为整数类型,但打印输出为字符串*/
type Gender int

func (g Gender) String() string {
    return []string{"男", "女", "保密"}[g]
}

const (
    //男的
    Male = iota
    //女的
    Female
    //保密
    Secrecy
)

// Use It
change := Gender(Male).String()
fmt.Println(change)
// 男

五、类型转换

类型转换要点

  • 相互兼容的不同类型可以相互转换,如数值类型之间(可能发生精度丢失)、非数值类型之间(字符、字节)
  • 非兼容类型转换需要标准包支持,如数值和非数值类型之间的转换

基本语法结构:

resultOfType := Type(expression)

示例:

//相互兼容的数值类型转换
var a int = 1
var b float64 = 3.1415

aa := float64(a)
bb := int(b)

fmt.Printf("a: Type=%T,Value=%v\n", a, a)
fmt.Printf("aa: Type=%T,Value=%v\n", aa, aa)
fmt.Printf("b: Type=%T,Value=%v\n", b, b)
fmt.Printf("bb: Type=%T,Value=%v\n", bb, bb)
//a: Type=int,Value=1
//aa: Type=float64,Value=1
//b: Type=float64,Value=3.1415
//bb: Type=int,Value=3

//相互兼容的非数值类型转换
var s string = "Go语言基础"
sBytes := []byte(s)
sUnit := []uint8(s)
sRunes := []rune(s)

fmt.Printf("s: Type=%T,Value=%v\n", s, s)
fmt.Printf("sBytes: Type=%T,Value=%v\n", sBytes, sBytes)
fmt.Printf("sUnit: Type=%T,Value=%v\n", sUnit, sUnit)
fmt.Printf("sRunes: Type=%T,Value=%v\n", sRunes, sRunes)

//s: Type=string,Value=Go语言基础
//sBytes: Type=[]uint8,Value=[71 111 232 175 173 232 168 128 229 159 186 231 161 128]
//sUnit: Type=[]uint8,Value=[71 111 232 175 173 232 168 128 229 159 186 231 161 128]
//sRunes: Type=[]int32,Value=[71 111 35821 35328 22522 30784]


//非兼容类型转换,使用strconv标准包,可实现字符串和数值类型的转换,以下示例为整型转换,其他可参考该包提供的方法:
//整型转字符串
var i = 1
s = strconv.Itoa(i)
fmt.Printf("i: Type=%T,Value=%v\n", i, i)
fmt.Printf("s: Type=%T,Value=%v\n", s, s)
//i: Type=int,Value=1
//s: Type=string,Value=1

//字符串转整型
var ss = "34"
ii, err := strconv.Atoi(ss)
if err != nil {
    fmt.Println("Atoi is equivalent to ParseInt(s, 10, 0), converted to type int")
}

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

推荐阅读更多精彩内容