Go 基础知识一

Go内置关键字(25个均为小写)

break        default           func        interface        select
case          defer              go           map               struct
chan          else                goto       package        switch
const         fallthrough    if             range             type
continue   for                  import    return             var 

Go注释方法

// :单行注释
/* */:多行注释

Go程序的一般结构:见代码

Go程序是通过 package 来组织的(与python类似)
只有 package 名称为 main 的包可以包含 main 函数
一个可执行程序 有且仅有 一个 main 包

通过 import 关键字来导入其它非 main 包
通过 const 关键字来进行常量的定义
通过在函数体外部使用 var 关键字来进行全局变量的声明与赋值
通过 type 关键字来进行结构(struct)或接口(interface)的声明
通过 func 关键字来进行函数的声明




代码示例

//当前程序的包名
package main

//导入其它的包
import (
    std "fmt"
)

//常量的定义
const (
    PI = 3.14
)

//全局变量的声明和赋值
var (
    name = "song"
)

//一般类型的声明
type newType int

//结构的声明
type song struct{}

//接口的声明
type steven interface{}

//由main 函数作为程序入口点启动

func main() {
    std.Println("hello word")
}

Go基本类型

布尔型:bool

- 长度:1字节
- 取值范围:true, false
- 注意事项:不可以用数字代表true或false

整型:int/uint

- 根据运行平台可能为32或64位

8位整型:int8/uint8

- 长度:1字节
- 取值范围:-128~127/0~255

字节型:byte(uint8别名)

16位整型:int16/uint16

- 长度:2字节
- 取值范围:-32768~32767/0~65535

32位整型:int32(rune)/uint32

- 长度:4字节
- 取值范围:-2^32/2~2^32/2-1/0~2^32-1

64位整型:int64/uint64

- 长度:8字节
- 取值范围:-2^64/2~2^64/2-1/0~2^64-1

浮点型:float32/float64

- 长度:4/8字节
- 小数位:精确到7/15小数位

复数:complex64/complex128

- 长度:8/16字节

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

其它值类型:

- array、struct、string

引用类型:

- slice、map、chan

接口类型:inteface

函数类型:func

类型零值

零值并不等于空值,而是当变量被声明为某种类型后的默认值,通常情况下值类型的默认值为0,bool为false,string为空字符串

单个变量的声明与赋值

:=是声明并赋值,并且系统自动推断类型,不需要var关键字

- 变量的声明格式:var <变量名称> <变量类型>
- 变量的赋值格式:<变量名称> = <表达式>
- 声明的同时赋值:var <变量名称> [变量类型] = <表达式>

多个变量的声明与赋值

- 全局变量的声明可使用 var() 的方式进行简写
- 全局变量的声明不可以省略 var,但可使用并行方式
- 所有变量都可以使用类型推断
- 局部变量不可以使用 var() 的方式简写,只能使用并行方式

变量的类型转换

Go中不存在隐式转换,所有类型转换必须显式声明
转换只能发生在两种相互兼容的类型之间
类型转换的格式:
    <ValueA> [:]= <TypeOfValueA>(<ValueB>)

常量的初始化规则与枚举

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

运算符

Go中的运算符均是从左至右结合

优先级(从高到低)
^ () ! (取反 ) (一元运算符)
* (乘) / (除) % (取余) <<(二进制左移) >> (二进制右移) & &^
+ - | ^ (二元运算符)
== != < <= >= >
<- (专门用于channel)
&&
||

示例

/*
  6:0110
 11:1011
----------
& 与 0010 (两个是1才是1,其它是0)
| 或 1111 (有一个是1就是1)
^    1101 (两个当中只能有一个为1)
&^   0100  (第二个运算值是1的话,第一个强制为0,结果为0)

*/

func main() {

    fmt.Println(6 & 11)
    fmt.Println(6 | 11)
    fmt.Println(6 ^ 11)
    fmt.Println(6 &^ 11)

}

计算机存储单位

package main

import (
    "fmt"
)

const (
    _          = iota
    KB float64 = 1 << (iota * 10)
    MB
    GB
    TB
    PB
    EB
    ZB
    YB
)

func main() {
    fmt.Println(KB)
    fmt.Println(MB)
    fmt.Println(GB)
    fmt.Println(TB)
    fmt.Println(PB)
    fmt.Println(EB)
    fmt.Println(ZB)
    fmt.Println(YB)

}

指针

Go虽然保留了指针,但与其它编程语言不同的是,在Go当中不支持指针运算以及”->”运算符,
而直接采用”.”选择符来操作指针目标对象的成员操作符”&”取变量地址,
使用”*”通过指针间接访问目标对象默认值为 nil 而非 NULL

package main
import (
    "fmt"
)
func main() {
    a := 1
    var b *int = &a
    fmt.Println(b)//指向b的内存地址
    fmt.Println(*b)//最出b的值
}

递增递减语句

    在Go当中,++ 与 -- 是作为语句而并不是作为表达式  如:a++ 不能放在 = 的右侧,只能单独用

判断语句if

条件表达式没有括号
支持一个初始化表达式(可以是并行方式)
左大括号必须和条件语句或else在同一行
支持单行模式
初始化语句中的变量为block级别,同时隐藏外部同名变量
1.0.3版本中的编译器BUG


package main

import (
    "fmt"
)

func main() {
    a := 10
    if a, b := 1, 5; a > 0 {
        fmt.Println(a)
        fmt.Println(b)
    }
    fmt.Println(a)

}

循环语句for

Go只有for一个循环语句关键字,但支持3种形式
初始化和步进表达式可以是多个值
条件语句每次循环都会被重新检查,因此不建议在条件语句中
使用函数,尽量提前计算好条件并以变量或常量代替
左大括号必须和条件语句在同一行


选择语句switch

可以使用任何类型或表达式作为条件语句
不需要写break,一旦条件符合自动终止
如希望继续执行下一个case,需使用fallthrough语句
支持一个初始化表达式(可以是并行方式),右侧需跟分号
左大括号必须和条件语句在同一行

跳转语句goto, break, continue

三个语法都可以配合标签使用
标签名区分大小写,若不使用会造成编译错误
Break与continue配合标签可用于多层循环的跳出
Goto是调整执行位置,与其它2个语句配合标签的结果并不相同


数组Array

定义数组的格式:var <varName> [n]<type>,n>=0
数组长度也是类型的一部分,因此具有不同长度的数组为不同类型
注意区分指向数组的指针和指针数组
数组在Go中为值类型
数组之间可以使用==或!=进行比较,但不可以使用<或>
可以使用new来创建数组,此方法返回一个指向数组的指针
Go支持多维数组

Go语言版冒泡排序

定义数组的格式:var <varName> [n]<type>,n>=0
数组长度也是类型的一部分,因此具有不同长度的数组为不同类型
注意区分指向数组的指针和指针数组
数组在Go中为值类型
数组之间可以使用==或!=进行比较,但不可以使用<或>
可以使用new来创建数组,此方法返回一个指向数组的指针
Go支持多维数组

Go语言版冒泡排序

package main

import (
    "fmt"
)

func main() {
    a := [...]int{4, 2, 6, 8, 1, 9, 10}

    num := len(a)

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