include

  1. 内置关键字
  2. 注释方法
  3. 代码结构(常量,变量,接口,函数的定义)
  4. 导入包以及包别名
  5. 可见性规则
  6. 小练习

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

  1. break
  2. case
  3. chan
  4. const
  5. continue
  6. default
  7. defer
  8. else
  9. fallthrough
  10. for
  11. func
  12. go
  13. goto
  14. if
  15. import
  16. interface
  17. map
  18. package
  19. range
  20. return
  21. select
  22. struct
  23. switch
  24. type
  25. var
  26. cap(x) 切片X的容量或者通道X的缓存容量或者数组的长度。
  27. close(x) 关闭通道ch(但是用于接受信息的通道是非法的)。不能往通道中发送数据。数据还可以从关闭的通道中接受(例如,任何已发送但未接收的值),并且如果通道中没有值了,接收端得到的将是该通道类型的零值。
  28. copy(dst,src) 将src切片中的项复制(可能是重叠)到dst切片,如果空间不够则截断;或者将字符串字节S复制到[]byte类型的b中。
  29. delete(m,k) 从映射m中删除其键为k的项,如果键为空就什么也不做。
  30. new(T) 一个指向类型T的值指针

注释方法

注释方法和js的一样

  1. // 单行注释
  2. /* */ 多行注释

代码结构

  • go程序是通过package来组织的(与python类似,通过包来组织)
  • 只有package名称为main的包可以包含main函数
  • 一个可执行程序有且仅有一个main包
  • 通过import 关键字来导入其他非 main包
  • 通过const关键字来进行常量的定义
  • 通过函数体外部使用var关键字来进行全局变量的声明与赋值
  • 通过type关键字来进行结构(struct)或者(interface)的声明
  • 通过func关键字进行函数的声明。

代码例子如下:

package main   //  当前程序包名,必须写在第一

import "fmt"   // 导入其他的包

const PI = 2.14   // 常量定义

var name = "Leo"  // 全局变量定义

type newType int   // 一般类型声明

type gopher struct{}   // 结构的声明  gopher是名字 {} 里面写的是逻辑代码

type golang interface{} // 接口的声明  golang是名字  {} 里面写的是逻辑代码

func main(){
fmt.Println("hellow world!"")
}

导入包

导入包我们除了可以一个一个的import导入进去,也可以import(一堆包名),代码如下:

import "fmt"   // 导入其他的包
import "os"
import "time"
import "strings" // 也可以这样写 import (
"io"
"sync"
)
  • 导入进去以后,我们可以就像python那样了,包名.方法名 去使用。
  • 如果导入包之后未调用其中的函数或者类型将会报编译错误,这样的话时为快速编译而改进的。如:
imported and not userd: "io"
包(package) 别名

等同于python里面的as ,不建议别名和包名一块使用。

  • import cname "fmt"
import std "fmt"
func main() {
std.Println("hellow world!")
} // 或者如下的例子 import (
"fmt"
t "go_dev/day2/example1/add"
) func main() {
fmt.Println("Name:", t.Name)
fmt.Println("Age:", t.Age)
}
  • import . "fmt"的方法,那么就不需要使用 方法名加上包名了,如下所示:
import . "fmt" // 导入其他的包
func main() {
Println("helddddlow world!")
}

init函数

每个源文件都可以包含一个init函数,在执行main函数之前init函数会被go运行框架执行。

// main
package main import (
"fmt"
t "go_dev/day2/example1/add"
) func init() {
fmt.Println("begin to init") // 执行main之前优先执行init函数
} func main() {
fmt.Println("Name:", t.Name)
fmt.Println("Age:", t.Age)
}

包导入先后顺序

我们知道有init函数,设我们有a,b2个包,,假设我们导入一个的这个a包里面有init函数的时候,且这a个包又导入了另外一个b包,另外一个b包也有init函数,那么他们init函数执行的先后顺序是怎么样的?

我们先看看代码目录结构:

我们先看看代码,从最深层里面的包来看,然后一层一层往外到最外层的main。

f1包
// f1
package fortest // package名字要和目录一样 import (
"fmt"
) var Age int = 111 // 定义两个变量,看会不会冲掉调用者add里这两个变量
var Name string = "Leo" func init() {
fmt.Println("init in f1")
fmt.Println("f1.Age", Age)
fmt.Println("f1.Name", Name)
Age = 22
fmt.Println("f1.Age after change", Age)
}
add1包
// add
package add // package名字要和目录一样 import (
"fmt"
_ "go_dev/day2/example1/fortest" // 引用fortest包,加个下划线是因为引用这个包(引用后init函数会起作用)而不想使用他
) var Name string = "Leo" // 同样两个变量
var Age int = 22 func init() {
fmt.Println("init in add1")
fmt.Println("add1.Name", Name)
fmt.Println("add1.Age", Age)
}
main包
// main
package main // package名字要和目录一样 import (
"fmt"
t "go_dev/day2/example1/add" // 前面加个t表示是给add起了一个别名为t
) func init() {
fmt.Println("begin to init")
} func main() {
fmt.Println("Name:", t.Name)
fmt.Println("Age:", t.Age)
}

此时我们运行下main函数试试看,运行命令和打印结果如下:

C:/go/bin/go.exe run main.go
init in f1
f1.Age 111
f1.Name Leo
f1.Age after change 22
init in add1
add1.Name Leo
add1.Age 22
begin to init
Name: Leo
Age: 22

由打印结果可知,我们可以得出下面三个结论

  1. 由此可见,我们在运行main函数的时候,首先是执行import函数,由于调用了add包,所以先执行add,而add文件里面又调用了fortest,所以最先执行的是fortest里的init函数与声明两个变量
  2. 虽然这fortest里面的两个变量和add文件里面的两个变量一样,那么是不会冲突的与覆盖的。
  3. 每个文件被调用的时候首先执行init方法

流程图下图所示:

值类型与引用类型

  1. 值类型就是传递给一个函数作为参数的时候是值拷贝,函数修改这个值不会影响到原值。
  2. 引用类型是传递给一个函数作为参数的时候是指针类型,函数修改这个值会影响到原值

全局变量与局部变量的作用域范围

全局与局部的区别就在于作用域,看下代码的代码例子,大家猜猜看输出结果是什么:

// god
package main import (
"fmt"
) var g string = "G" // 全局变量是G func n() {
fmt.Println(g)
} func m() {
g := "O" // 定义局部变量O
fmt.Println(g)
} func main() {
n()
m()
n()
}

我们先分析下上面的过程

  • 我们先定义了一个g变量,值为G
  • 然后我们在n函数里面直接使用了这个g变量
  • 我们在m函数里面定义了一个局部变量g,作用域范围只在这个函数。

    综合上面三个说的点,打印结果是GOG。

试想下如果把m函数换成下面的代码,输出结果会是啥?

func m() {
g = "O" // 定义局部变量O
fmt.Println(g)
}

g="O" 这个是直接把全局变量修改了O,所以打印结果就是GOO了。

可见性规则

在go语言中,使用大小写来决定该常量、变量、类型、接口、结构或者函数是否可以被外部调用,约定规则如下:

  • 函数名首字母小写即为private
  • 函数名首字母大写为public

小练习

  1. 如何同时定义多个常量、全局变量
  2. 如何同时定义多个类型

代码如下:

// testme
package main import (
"fmt"
) // 定义多个常量
const (
PI = 3.14
h1 = "Leo"
w = "Beijing"
) // 全局变量的声明与赋值
var (
name = "Leo"
Name1 = "ljf"
age = 22
) // 一般类型的声明
type (
newType int
type1 float32
type2 string
type3 byte
) func main() {
fmt.Println(PI, w, age)
}

2 go语言的基础的更多相关文章

  1. iOS开发系列--C语言之基础知识

    概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...

  2. Golang友团无闻Go语言Web基础视频教程

    教程内容:GO语言资料Golang友团无闻Go语言编程基础Golang友团无闻Go语言Web基础教程 Go语言Web基础教程列表:[Go Web基础]12Go Web 扩展学习.mp4[Go Web基 ...

  3. 10个经典的C语言面试基础算法及代码

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

  4. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  5. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  6. Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识

    JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...

  7. c语言学习基础:[1]开发工具介绍

    标签:c语言 1 2 3 4 分步阅读 学习编程语言的童鞋们一开始接触到的最多的估计就是C语言了,其次才是什么java.c++等,可以说学习c语言是我们走向编程世界的一座桥梁,学好它,对于我们学习和研 ...

  8. 关于JS脚本语言的基础语法

    JS脚本语言的基础语法:输出语法  alert("警告!");  confirm("确定吗?");   prompt("请输入密码");为弱 ...

  9. 2.4JAVA基础复习——JAVA语言的基础组成数组

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  10. 2.3JAVA基础复习——JAVA语言的基础组成函数

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

随机推荐

  1. corntab被黑记录

    多出来的corntab 最近服务器经常出现负载过高的情况,经过运维排查,出现了一个corntab定时任务 不是开发的锅,别背 一开始运维认为是这个定时任务是我们开发的. 排查后,明确了服务器是被黑了. ...

  2. 【Unity笔记】制作小地图Minimap

    真正的手把手教程,太棒了: http://forum.china.unity3d.com/thread-17192-1-1.html 或者是使用插件NJG MiniMap: http://www.ta ...

  3. 9g10在nandflash扇区的分配地址

  4. Extjs4.2 TreeView TreeStore 移除节点不触发delete(remove node don't trigger delete method)

    当我们操作treeview的时候,新增节点,如果成功则新增node,如果失败的话我们不想node还显示出来,可以通过监听sync的failure事件,失败时候移除node,但是第一次肯定达到了预期效果 ...

  5. IOC容器:Unity

    一.什么是IOC 学习IOC之前先来了解一个依赖导致原则(DIP),依赖导致原则是IOC的核心原理. 依赖导致:即上层模块不应该依赖于低层模块,二者应该通过抽象来依赖.依赖于抽象,而不是依赖于细节. ...

  6. 无法转换json问题 Error: Model.nodeDataArray value is not an instance of Array or NodeList or HTMLCollection

    var jsonobj=eval('('+t+')'); 使用eval 函数,讲后台json字符串转换为前台jsarray数组. 如果使用 ajax不会出现这种情况,因为会自动转换. 但是如果直接从后 ...

  7. JQ 获取窗体的高度

    alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height()); //浏览器时下窗口文档的高度 alert($(docum ...

  8. 内存映射文件(Memory-Mapped File)

    Java Memory-Mapped File所使用的内存分配在物理内存而不是JVM堆内存,且分配在OS内核. 1: 内存映射文件及其应用 - 实现一个简单的消息队列 / 计算机程序的思维逻辑 在一般 ...

  9. 机器学习 demo分西瓜

    周老师的书,对神经网络写了一个小的Demo 是最简单的神经网络,只有一层的隐藏层. 这次练习依旧是对西瓜的好坏进行预测. 主要分了以下几个步骤 1.数据预处理 对西瓜的不同特性进行数学编码表示(0~1 ...

  10. pandas Series KeyError: -1

    前几天写分析方法,遇到的一个错误: 具体我已经在stackoverflow 里面得到了详细的解答,下面我把问题和解决办法总结一下,方便日后的回顾 问题: sql = "select {}, ...