go基础编程day2类型、变量、常量、运算符

const var type几个关键词的简单使用

package main

import "fmt"

// 定义常量
const (
    P      = 3.14
    const1 = 1
    const2 = "2"
    const3 = 3
)

//全局变量的声明与赋值
var (
    name  = "james"
    age   = 18
    name2 = "nihao"
)

// 一般类型的声明 type关键字
type (
    newType int
    type1   float32
    type2   string
)

func main() {
    fmt.Printf("Hello %s!\n", name) // Hello james!
}

重点理解第三个type关键词,已知这些类型,int,string等等,但是type可以声明自己的类型,这里newType属于一个新的类型,但是他的基础类型还是int,但跟int并不是同一个类型newType是他的命名

go基本类型

  • 布尔型:bool
    长度:1字节
    取值范围:true、false
    注意:不能像某些语言一样使用01数字来代表true或者false

  • 整型:int/uint
    根据运行平台可能为32位(uint)或者64位(int)

  • 8位整型:int8/uint8
    长度:1字节
    取值范围:-128~127/0~255

  • 字节型:byte(uint8别名)

  • 16位整型:int16/uint16
    长度:2字节
    取值范围:-32768~32767/0~65535

  • 32位整型:int32(rune)/uint32
    长度:4字节
    取值范围:(232/2~232/2-1)/(0~2^32-1)

  • 64位整型:int64/uint64
    长度:8字节
    取值范围:同理

  • 浮点型:float32/float64
    长度:4/8字节
    精准度:精确到7/15小数位

  • 复数:complex64/complex128
    长度:8/16字节

  • 足够保存指针的32位或64位整数型:uintptr

  • 其他值类型:
    array、struct、string

  • 引用类型:
    slice、map、chan

  • 接口类型:interface

  • 函数类型:func

注意区分值类型和引用类型,会在后面变量传递的时候有区别

类型零值

零值并不等于空值,而是当变量被声明为某种类型后的默认值,就是说你在声明他的时候就存在值了,通常情况下值类型的默认值为0,比如int,就是一个0,slice就是多个或一个0,bool的默认值为false,string为空的字符串

package main

import "fmt"

func main() {
    var a int
    var b []int
    var c string
    var d bool
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
    fmt.Println(d)
}

/*
0
[]

false
*/

类型别名

// 一般类型的声明 type关键字
type (
    newType int
    type1   float32
    type2   string
)

就是为类型起一个别名,注意的是基础类型与别名之后的类型并不完全对等,赋值等等需要转换

单个变量的声明与赋值

这个我刚看也有点愁人,声明和赋值的方法很多,并不是会简单好用的一种就够了,毕竟也要读别人的代码,所以必须全部掌握

第一种:声明-赋值

package main

import "fmt"

func main() {
    // 声明 var-命名-类型
    var a int
    // 赋值
    a = 111
    fmt.Println(a) // 111
}

第二种:类型推断

package main

import "fmt"

func main() {
    // 赋值并类型推断
    var a = 111
    fmt.Println(a) // 111
}

第三种:声明并赋值简单写法

package main

import "fmt"

func main() {
    // 声明并赋值简单写法
    a := 111
    fmt.Println(a) // 111
}

这些方式不仅适用int等等这些类型的声明,也适用一些其他类型的声明,所以要掌握

系统推断的声明赋值前提是在使用过程中值的类型不会发生转变,否则会抛出错误

声明赋值变量要注意的点:

  • 全局变量声明不能省略var关键字换成:=来声明

  • 多个全局变量可以使用var()进行简写

  • 所有的变量都可以使用类型推断

  • 局部变量不可以使用var()方式简写,只能使用并行方式

package main

import "fmt"

// 全局变量 支持多个变量赋值,支持并行,不可省略var
var (
    a      = "hello"
    b      = "hi"
    aa, bb = 1, 2
)

func main() {
    // 不可以使用括号,但是可以使用并行,可以省略var使用简写
    var a, b, c, d int
    a, b, c, d = 1, 2, 3, 4
        // 也可以忽略赋值,只用_来代替变量名,可用于多返回值但是不需要全部返回值的时候
        // 上面两句等价 var a, b, c, d int = 1, 2, 3, 4
    e, f, g := 5, "ss", 6
    fmt.Println(a, b, c, d, e, f, g)
}

变量的类型转换

  • go中不存在隐式转换,所有类型转换必须显式声明
  • 转换只能发生在两种相互兼容的类型之间
package main

import "fmt"

func main() {
    var a float32 = 1.1
    b := int(a)
    fmt.Println(b) // 1

    var c bool = true
    d := int(c) // cannot convert c (type bool) to type int
}

要注意数字转字符串的时候会转为对应的字母,想要真正的转换成字符串需要库strconv

package main

import "fmt"
import "strconv"

func main() {
    var a int = 65
    b := string(a)
    fmt.Println(b) // A
    // int转string
    c := strconv.Itoa(a)
    fmt.Println(c) // 65
    d, e := strconv.Atoi(c)
    fmt.Println(d)
    fmt.Println(e)
}

常量及运算符

常量的定义

  • 常量的值在编译时就已经确认
  • 常量定义格式与变量基本相同
  • 等号右侧必须是常量或者常量表达式(必须是常量,不能是运行中产生的)
  • 常量表达式中的函数必须是内置函数(自己写的函数不可以)
  • ++ --作为语句并不作为表达式 即不能放在等号右边
package main

import "fmt"

const a int = 2
const b = "A"

const (
    c = a + 1
    d = a * 3
    // 没有表达式或者常量的话会自动选择上一行的表达式,前提是这两行格式相同
    e
    f, g = 22, 33
)

func main() {
    fmt.Println(a) // 2
    fmt.Println(b) // A
    fmt.Println(c) // 3
    fmt.Println(d) // 6
    fmt.Println(e) // 6
    fmt.Println(f) // 22
    fmt.Println(g) // 33
}

常量的初始化规则与枚举

  • 在定义常量组时,如果不提供初始值,则表示将使用上行的表达式
  • 使用相同的表达式不代表具有相同的值
  • iota是常量的计数器,从0开始,组中每定义一个常量自动递增1
  • 通过初始化规则与iota可以达到枚举的效果
  • 每遇到一个const关键字,iota就会重置为0
package main

import "fmt"

const (

    // 使用双引号是会输出字符串A,单引号输出对应的数字
    a = 'A'
    b
    // 此时iota为2
    c = iota
    d
)

const (
    // 新的关键词const iota从0开始
    e = iota
)

func main() {
    fmt.Println(a) // 65
    fmt.Println(b) // 65
    fmt.Println(c) // 2
    fmt.Println(d) // 3
    fmt.Println(e) // 0
}

枚举应用

package main

import (
    "fmt"
)

const (
    a      = 0
    Monday = iota
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
)

func main() {
    fmt.Println(Sunday) // 7
}

运算符

  • go语言中运算符同样遵循从左至右的运算顺序
  • 优先级(从高到低)
    ^ ! (一元运算)
    * / % << >> & &^
    + - | ^ (二元运算)
    == != < <= >=
    <- (专用与channel)
    &&
    ||

新接触:
>> << 左移/右移多少位
& | ^ &^ 四个位运算符

/*
6:  0110
11: 1011

---------

两个数位运算先转换为2进制

&   0010 = 2    和
|   1111 = 15   或
^   1101 = 13   对比过程中只存在一个1则为1
&^  0100 = 4    如果第二个数对应的位置为1,则将第一个数对应的位置转换为0
之后再转换回10进制

*/

func main() {
    fmt.Println(6 & 11)  // 2
    fmt.Println(6 | 11)  // 5
    fmt.Println(6 ^ 11)  // 13
    fmt.Println(6 &^ 11)  // 4
}

单个的&变为了位运算符,&&作为‘与’运算符,左边条件不成立则右边不执行

实现计算机存储单位的枚举

const (
    B float64 = 1 << (iota * 10)
    KB
    MB
    GB
    TB
)

func main() {

    fmt.Println(B)  // 1
    fmt.Println(KB)  // 1024
    fmt.Println(MB)  // 1.048576e+06
    fmt.Println(GB)  // 1.073741824e+09
    fmt.Println(TB)  // 1.099511627776e+12
}

指针

指针属于要深入了解的东西,

  • go虽然保留了指针,但是在go中并不支持指针运算以及->运算符,而是采用.选择符来操作指针目标对象成员

  • 操作符&取变量地址,使用*通过指针间接访问目标对象

  • 默认值为nil非NULL

package main

import (
    "fmt"
)

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

推荐阅读更多精彩内容