2 go语言的基础
include
- 内置关键字
- 注释方法
- 代码结构(常量,变量,接口,函数的定义)
- 导入包以及包别名
- 可见性规则
- 小练习
内置关键字(25个均为小写)
- break
- case
- chan
- const
- continue
- default
- defer
- else
- fallthrough
- for
- func
- go
- goto
- if
- import
- interface
- map
- package
- range
- return
- select
- struct
- switch
- type
- var
- cap(x) 切片X的容量或者通道X的缓存容量或者数组的长度。
- close(x) 关闭通道ch(但是用于接受信息的通道是非法的)。不能往通道中发送数据。数据还可以从关闭的通道中接受(例如,任何已发送但未接收的值),并且如果通道中没有值了,接收端得到的将是该通道类型的零值。
- copy(dst,src) 将src切片中的项复制(可能是重叠)到dst切片,如果空间不够则截断;或者将字符串字节S复制到[]byte类型的b中。
- delete(m,k) 从映射m中删除其键为k的项,如果键为空就什么也不做。
- new(T) 一个指向类型T的值指针
注释方法
注释方法和js的一样
- // 单行注释
- /* */ 多行注释
代码结构
- 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
由打印结果可知,我们可以得出下面三个结论
- 由此可见,我们在运行main函数的时候,首先是执行import函数,由于调用了add包,所以先执行add,而add文件里面又调用了fortest,所以最先执行的是fortest里的init函数与声明两个变量
- 虽然这fortest里面的两个变量和add文件里面的两个变量一样,那么是不会冲突的与覆盖的。
- 每个文件被调用的时候首先执行init方法
流程图下图所示:
值类型与引用类型
- 值类型就是传递给一个函数作为参数的时候是值拷贝,函数修改这个值不会影响到原值。
- 引用类型是传递给一个函数作为参数的时候是指针类型,函数修改这个值会影响到原值
全局变量与局部变量的作用域范围
全局与局部的区别就在于作用域,看下代码的代码例子,大家猜猜看输出结果是什么:
// 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
小练习
- 如何同时定义多个常量、全局变量
- 如何同时定义多个类型
代码如下:
// 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语言的基础的更多相关文章
- iOS开发系列--C语言之基础知识
概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...
- Golang友团无闻Go语言Web基础视频教程
教程内容:GO语言资料Golang友团无闻Go语言编程基础Golang友团无闻Go语言Web基础教程 Go语言Web基础教程列表:[Go Web基础]12Go Web 扩展学习.mp4[Go Web基 ...
- 10个经典的C语言面试基础算法及代码
10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
- Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识
JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...
- c语言学习基础:[1]开发工具介绍
标签:c语言 1 2 3 4 分步阅读 学习编程语言的童鞋们一开始接触到的最多的估计就是C语言了,其次才是什么java.c++等,可以说学习c语言是我们走向编程世界的一座桥梁,学好它,对于我们学习和研 ...
- 关于JS脚本语言的基础语法
JS脚本语言的基础语法:输出语法 alert("警告!"); confirm("确定吗?"); prompt("请输入密码");为弱 ...
- 2.4JAVA基础复习——JAVA语言的基础组成数组
JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...
- 2.3JAVA基础复习——JAVA语言的基础组成函数
JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...
随机推荐
- Android NFC近场通信1——NFC概述
最近对NFC挺感兴趣,而且新换的手机也支持NFC功能(最近换了Find5,感觉还不错O(∩_∩)O),所以打算学学NFC编程.NFC就是我们经常说的近场通信.通常距离是4厘米或更短.NFC工作频率是1 ...
- duubo开发时直连(不需要注册中心)
前言 在dubbo开发时,一般开发人员不连注册中心,在这里记录下1.consumer端配置 <?xml version="1.0" encoding="UTF-8& ...
- WPF System.InvalidCastException: 无法将类型为“System.Windows.Media.Color”的对象强制转换为类型“System.Windows.Media.Brush”。
场景:添加ComboBox样式,界面卡死,日志异常文件如下: -- ::, | ERROR | System.InvalidCastException: 无法将类型为“System.Windows.M ...
- 私有IP地址共有三个范围段
在现在的网络中,IP地址分为公网IP和私有IP地址.公网IP是在Internet使用的IP地址,而私有IP地址是在局域网中使用的IP地址. 由于我们目前使用的IP V4协议的限制,现在IP地址的数量是 ...
- layer.open如何关闭自身弹出窗口
1. 弹出窗口中本身可以添加按钮事件如下: layer.open({ title: '打印' ,type: 2 ,content: [ctx + '/saleOrder/eorderEdit?orde ...
- ansible playbook对错误的处理
Topics Playbooks 中的错误处理 忽略错误的命令 控制对失败的定义 覆写更改结果 Ansible 通常默认会确保检测模块和命令的返回码并且会快速失败 – 专注于一个错误除非你另作打算. ...
- RavenDb学习(二)简单的增删查改
在上一节当中已经介绍了RavenDb的文档设计模式,这一节我们要具体讲一讲如何使用api去访问RavenDb .连接RavenDb var documentStore = new DocumentSt ...
- 【C】——如何生成静态库和动态库
对于一个编译型语言,编译器工作时总要经过预处理.编译.链接等几个过程.以 C/C++ 为例:预处理器(cpp)将每个 .c/.cpp 文件中 #include 的头文件都合并到 .c/.cpp 文件中 ...
- substance新版及问题
新版地址:https://github.com/Insubstantial,目前是7.3版 http://stackoverflow.com/questions/3657538/substance-u ...
- orcale的over的使用
--------------------------- 建表 --------------------------- create table test_user( id VARCHAR2(12), ...