Go入门系列(二)基础

RabbitMask · · 526 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

目录:
一、数据类型
二、常量变量
二、基本逻辑

一、数据类型

对比python,我们必须意识到GoLang是一门强类型语言。

1、布尔型

在 Go 中,布尔值的类型为 bool,值是 true 或 false,默认为 false。

func main() {
    var a bool
    fmt.Println(a)
}
#输出
false
2、数字类型
  • 整型
类型    取值范围
int8    -128到127
uint8   0到255
int16   -32768到32767
uint16  0到65535
int32   -2147483648到2147483647
uint32  0到4294967295
int64   -2^(64-1)到2^(64-1)-1
uint64  0到2^64-1

所谓无符号类型即为非负类型。

  • 浮点型
    float32和float64.它们的算术规范由IEEE754浮点数国际标准定义, 该浮点数规范被所有现代的CPU支持。
  • 复数
    complex64和complex128,分别对应float32和float64两种浮点数精度。内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部。
func main() {
    var x complex64 = complex(1, 2) 
    var y complex64 = complex(3, 4) 
    fmt.Println(x*y)                 
    fmt.Println(real(x*y))           
    fmt.Println(imag(x*y))           
}
#输出
(-5+10i)
-5
10
  • 其它
byte  与uint8等价
rune  与int32等价
uint  取值位数等于cpu位数(32/64)
int   取值位数等于cpu位数(32/64)
uintptr  无符号整型,用于存放一个指针

在go>=1.9时,对于数字类型,无需定义int及float32、float64,系统会自动识别。
尤其是int类型,在使用goland时,会直接给予“类型可忽略”的提示。

func main() {
 var a =1
 var b =1.3333
 fmt.Println(a,b)
}
#输出
1 1.3333

讲到这里,想顺便提一下go的一个特性,严格的内存管理。在之前做白盒测试的时候,有一个低风险项:声明但未使用,严格来讲对系统并没有直接危害,但确实对内存真实的浪费。这个问题在Go这里不再纠结了,如果声明却不使用,语法检查不会通过。

func main() {
 var a =1
 var b =2
 fmt.Println(a)
}
#输出
# command-line-arguments
b declared and not used
3、字符串类型
  • 定义
    同样,我们可以看到字符串的声明是不需要特别声明类型的。
    对比python,字符串类型必须使用双引号,单引号不可。

此外,多行声明须使用反引号,但是这个时候转义符不再生效,/允悲。

func main() {
 var a  =`终究
还是一个人
扛下了所有`

 fmt.Println(a)
}
#输出
终究
还是一个人
扛下了所有
  • 组合
    支持加号连接,尽可能灵活即可。
func main() {
 var a = "rabbit"
 var b = "mask"
 a += b
 fmt.Println(a+"!")
}
#输出
rabbitmask!
4、派生类型

这个简单提及,后期根据进度展开。

(a) 指针类型(Pointer)
(b) 数组类型
(c) 结构化类型(struct)
(d) Channel 类型
(e) 函数类型
(f) 切片类型
(g) 接口类型(interface)
(h) Map 类型

二、常量变量

1、变量
上面交代了那么久的数据类型,最终还是为这里服务的,最基础的变量定义方式为:var identifier type,此外也可灵活运用贴合Go的习惯。

  • 定义类型而不初始化
    变量默认为零值,当然布尔型默认为false上面已经提过了。
  • 直接初始化自动判定变量类型
    这个无论是上面的int还是字符串都很好的体现了这一点。
  • 省略 var, identifier := value格式替代。这种不带声明格式的只能在函数体中出现,不可以用于全局变量的声明与赋值,使用操作符 :=可以高效地创建一个新的变量,称之为初始化声明。同第二种方式,其类型根据初始化数值自动判定。
func main() {
 a := "rabbitmask"
 fmt.Println(a)
}
#输出
rabbitmask

2、常量
定义方式为const identifier [type] = value
同样,可省略type自动判定。
支持批量常量定义,未赋值则默认为前面的初始值。

func main() {
    const (
        a=1
        b=2
        c
        d
    )
 fmt.Println(a,b,c,d)
}
  • iota 常量生成器
    此外可借助iota批量生成常量。
func main() {
    type num int
    const (
        a num=iota
        b
        c
        d
    )
 fmt.Println(a,b,c,d)
}
#输出
0 1 2 3

三、基本逻辑

1、判断

  • if...else...嵌套
func main() {
    age :=18
    if age>0{
        if age<100{
            fmt.Printf("%d?this's ok",age)
        }
    }else {
        fmt.Println("Are u kidding me?")
    }
}
#输出
18?this's ok
  • switch 语句
func main() {
    var grade string
    marks := 90

    switch marks {
    case 90:
        grade = "A"
    case 80:
        grade = "B"
    case 50,60,70:
        grade = "C"
    default:
        grade = "D"
    }
    fmt.Printf("grade is %s",grade)
}
#输出
grade is A

如果使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true,但是前提是成功执行当前语句,做个对比。

func main() {
    var grade string
    marks := 90

    switch marks {
    case 90:
        grade = "A"
        fmt.Printf("grade is %s",grade)
    case 80:
        grade = "B"
        fmt.Printf("grade is %s",grade)
        fallthrough
    case 50,60,70:
        grade = "C"
        fmt.Printf("grade is %s",grade)
    default:
        grade = "D"
        fmt.Printf("grade is %s",grade)
    }
#输出
grade is A
func main() {
    var grade string
    marks := 90

    switch marks {
    case 90:
        grade = "A"
        fmt.Printf("grade is %s\n",grade)
        fallthrough
    case 80:
        grade = "B"
        fmt.Printf("grade is %s\n",grade)
    case 50,60,70:
        grade = "C"
        fmt.Printf("grade is %s\n",grade)
    default:
        grade = "D"
        fmt.Printf("grade is %s\n",grade)
    }
}
#输出
grade is A
grade is B

2、循环
这里有个和其它语言较大带的差异点,go语言没有while语法,类似其他语言的while(1)可以使用for ture代替。

func main() {
    var i, j int

    for i = 1; i < 10; i++ {
        for j = 1; j < 10; j++ {
            fmt.Printf("%d X %d = %d  ", i, j, i*j)
        }
        fmt.Print("\n")
    }
}
#输出
小九九(略)

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:RabbitMask

查看原文:Go入门系列(二)基础

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

526 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传