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. PowerDesigner导出表到HTML或word(实测有效)

    推荐生成HTML,因为看起来更加简洁 一.模版修改 在导出表时,powerdesigner默认为我们提供了很多的模版,在工具栏中选择[Report--->Report Template]即可看到 ...

  2. 从Unauthorized 401错误学习Spring Boot的Actuator

    之前用Spring Boot都是别人搭好的框架,然后自己在里面写就行了.对原理.细节上都怎么涉及,毕竟需求都做不完.但是昨天一个访问RESTful接口的401问题搞了我2个小时.网上找的很多用: ma ...

  3. JMeter (1) —— JMeter与WebDriver安装与测试(101 Tutorial)

    JMeter (1) -- JMeter与WebDriver安装与测试(101 Tutorial) 主要内容 JMeter安装 WebDriver安装 一个简单的JMeter+WebDriver示例 ...

  4. [转].Net连接池超时注意事项

    http://blog.csdn.net/jxqvip/article/details/6738551 超时时间已到.超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并 ...

  5. viewpager+fragment滑动切换卡顿问题

    最近在做项目的时候遇到个问题,viewpager中的fragment添加使用listview添加数据后出现滑动卡顿,造成用户体验感极差.找了很久的资料,也试了很多大方法,在这里给大家分享下: 1.添加 ...

  6. 【转】如果有人让你推荐Python技术书,请让他看这个列表

    入门级 <Head First Python>+ 入门级 + 微信49票 + 豆瓣评分 9.5 推荐语: 66:浅显易懂,编排的顺序特别,有大量插图.对话,不感觉枯燥 古心:通熟易懂,配有 ...

  7. Qt之QLocalServer

    简述 QLocalServer提供了一个基于本地socket的server. QLocalServer可以接受来自本地socket的连接.通过调用listen(),让server监听来自特定key的连 ...

  8. js if判断 遍历 替换图片地质

    <script> $(document).ready(function() { var s = "The rain in Spain falls mainly in the pl ...

  9. thinkphp 伪静态 自定义后缀

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.we ...

  10. 推荐一个不错的关于Excel数据统计分析的公众号