Go语言基础(二)
Go语言基础(二)
跟着上篇,继续看Go基础
一、变量作用域
与C类似,有全局变量、局部变量、形参之分
package main
import "fmt"
// 全局变量
var c = 20
func main() {
// 局部变量
a := 10
b := 20
fmt.Println("a = ", a)
fmt.Println("a + b = ", sum(a, b))
fmt.Println("c = ", c)
}
// 形参
func sum(a int, b int) int{
a ++
c ++ // 修改全局变量
fmt.Println("in sum() a = ", a)
return a + b
}
运行结果:
a = 10
in sum() a = 11
a + b = 31
c = 21
二、数组
与C基本一致
package main
import "fmt"
func avg(a []int) float64{
var s = 0.0 // 默认是float64
n := len(a)
// 类C数组的访问
for i := 0; i < n; i++ {
s += float64(a[i])
}
return s / float64(n)
}
func main() {
var balance = []int{5, 4, 3, 2, 1}
// 数组传递和C语言一样
result := avg(balance)
fmt.Println("average of balance = ", result)
// foreach遍历
for index, element := range balance{
fmt.Println(index, element)
}
}
运行结果:
average of balance = 3
0 5
1 4
2 3
3 2
4 1
三、指针
和C语言一致,操作符为&和*,且支持多级指针
package main
import "fmt"
func main() {
a := 10
b := 20
swap(&a, &b)
fmt.Println("a = ", a)
fmt.Println("b = ", b)
}
func swap(x *int, y *int) {
*x, *y = *y, *x
}
运行结果:
a = 20
b = 10
四、结构体
结构体和C的struct一致,由于Go没有显式的class,结构体还承载了面向对象的特性,比较灵活
package main
import "fmt"
type Person struct {
name string
age int
}
// 函数方法
func (person *Person) say() {
fmt.Println("name: ", person.name,
"age: ", person.age)
}
func (person *Person) grow() {
// 传指针的情况会修改对象本身
// 如果参数不是对象指针,则改变的是对象的副本
fmt.Println(person.name, "grow...")
person.age ++
}
func printPerson(person *Person) {
fmt.Println("name: ", person.name,
"age: ", person.age)
}
func main() {
// 初始方法一
var p1 Person
p1.name = "Jack"
p1.age = 20
// 初始方法二
var p2 = Person{"Mike", 21}
// 初始方法三,key-value形式
var p3 = Person{
name: "Tom",
age: 30,
}
printPerson(&p1)
// 模拟对象
p2.say()
p2.grow()
p2.say()
p3.say()
}
运行结果:
name: Jack age: 20
name: Mike age: 21
Mike grow...
name: Mike age: 22
name: Tom age: 30
五、切片
切片的用法和Python相似,但灵活性没那么高,不过比C的数组强大很多
package main
import "fmt"
func main() {
nums := []int {0, 1, 2, 3, 4, 5, 6, 7, 8}
// 原始切片
fmt.Println(nums)
// 切片
fmt.Println(nums[1:4])
fmt.Println(nums[:3])
fmt.Println(nums[2:])
// 添加元素
nums = append(nums, 9)
// 一次添加多个
nums = append(nums, 10, 11, 12)
// 浅拷贝,会修改b[0]的值
nums2 := nums[:]
nums2[0] = -1
fmt.Println("nums2: ",nums2)
fmt.Println("nums: ",nums)
// 深拷贝用法
nums3 := make([]int, len(nums))
copy(nums3, nums)
nums3[0] = -2
fmt.Println("nums3: ", nums3)
fmt.Println("nums: ", nums)
}
运行结果:
[0 1 2 3 4 5 6 7 8]
[1 2 3]
[0 1 2]
[2 3 4 5 6 7 8]
nums2: [-1 1 2 3 4 5 6 7 8 9 10 11 12]
nums: [-1 1 2 3 4 5 6 7 8 9 10 11 12]
nums3: [-2 1 2 3 4 5 6 7 8 9 10 11 12]
nums: [-1 1 2 3 4 5 6 7 8 9 10 11 12]
六、Range用法
foreach遍历
package main
import "fmt"
func main() {
// 普通foreach对字符串的遍历
// c的值为字符的unicode编号
for i, c := range "abc" {
fmt.Println(i, c)
}
// key-value遍历
dict := map[int]string{
1: "apple",
2: "banana",
}
for k, v := range dict {
// 格式化输出
fmt.Printf("%d -> %s\n", k, v)
}
}
运行结果:
0 97
1 98
2 99
1 -> apple
2 -> banana
七、哈希表
和Python的dict用法一致
package main
import "fmt"
func main() {
countryCapitalMap := make(map[string]string)
// 插入元素
countryCapitalMap["France"] = "Paris"
countryCapitalMap["Italy"] = "Rome"
countryCapitalMap["Japan"] = "Tokyo"
countryCapitalMap["India"] = "New Delhi"
// 查询
fmt.Println(countryCapitalMap["Italy"])
// 删除
delete(countryCapitalMap, "Italy")
// exist == false
capital, exist := countryCapitalMap["Italy"]
if exist {
fmt.Println(capital)
} else {
fmt.Println("Not exist")
}
}
运行结果:
Rome
Not exist
八、面向接口
Go语言的接口和Java概念类似,把同一类操作的方法放在一起,表示某一类功能
package main
import "fmt"
type Phone interface {
call()
}
// 定义结构体
type NokiaPhone struct{}
type IPhone struct{}
// 实现call方法
func (nokiaPhone NokiaPhone) call() {
fmt.Println("NokiaPhone Call")
}
// 实现call方法
func (iPhone IPhone) call() {
fmt.Println("IPhone Call")
}
func main() {
var phone Phone
// 面向接口编程
phone = new(NokiaPhone)
phone.call()
phone = new(IPhone)
phone.call()
}
运行结果:
NokiaPhone Call
IPhone Call
Go语言基础(二)的更多相关文章
- C语言基础二(敲打键盘、寻找资料)
看过很多资料的人,估计发觉了什么,我上篇的基础一其中一个最致命的错误,没有加return 0; 为什么不加,说真的,我留个坑,所以跳跃性的直接说到函数是如何运用的. 上章说到main就是主入口,根据m ...
- Java语言基础二
1.常量的概述和使用 A:什么是常量 B:Java中常量的分类 常量分类为六种:a.”字符串” b.’字符’ c.整数 d.小数 e.boolern(布尔类型) 返回值为 FALSE和TRUE ...
- C语言基础--二维数组
二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...
- C语言基础:二维数组 分类: iOS学习 c语言基础 2015-06-10 21:42 16人阅读 评论(0) 收藏
二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...
- C语言基础二维数组
(1)二位数组的定义int array[n][m],行下标的取值范围是0~n-1,列下标的取值范围是0~m-1,二维数组最大下标元素是array[n-1][m-1]:如定义一个3行4列的数组 int ...
- 01C语言基础(二)
Day07 笔记 指针和函数: 栈 帧: 当函数调用时,系统会在 stack 空间上申请一块内存区域,用来供函数调用,主要存放 形参 和 局部变量(定义在函数内部). 当函数调用结束,这块内存区域自动 ...
- Go语言基础二:常用的Go工具命令
常用的Go工具命令 Go附带了一下有用的命令,这些命令可以简化开发的过程.命令通常包含的IDE中,从而使工具在整个开发环境中保持一致. go run 命令 go run命令实在开发过程中执行的最常见的 ...
- R语言基础(二) 可视化基础
> which.max(apply(x[c("x1","x2","x3")], 1, sum))49 > x$num[which ...
- C语言基础二
C--顺序程序设计 赋值语句 赋值语句和赋值表达式的区别: if((a = b) > 0) t = 0; 字符数据的输入输出 putchar函数 该函数为字符输出函数,其作用是向终端数出一个字符 ...
- C语言基础二 练习
指出正确标识符 命名 l 只能由26个英文字母的大小写.10个阿拉伯数字0~9.下划线_组成 l 严格区分大小写,比如test和Test是2个不同的标识符 l 不能以数字开头 l 不可以使用关键字作为 ...
随机推荐
- Java SE API —— 【Math 】之【BigInteger】类
目录 概述 构造方法 BigInteger(byte[] val) 概述 不可变的任意精度的整数.提供了模算术.GCD 计算.质数测试.素数生成.位操作以及一些其他操作. 算术运算的语义完全模仿 Ja ...
- 20164305 徐广皓 Exp3 免杀原理与实践
免杀原理及基础问题回答 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧 使用msf编码器生 ...
- Python django解决跨域请求的问题
解决方案 1.安装django-cors-headers pip3 install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS = [ . ...
- 论文阅读笔记(一)FCN
本文先对FCN的会议论文进行了粗略的翻译,使读者能够对论文的结构有个大概的了解(包括解决的问题是什么,提出了哪些方案,得到了什么结果).然后,给出了几篇博文的连接,对文中未铺开解释的或不易理解的内容作 ...
- 2018-2019-2 网络对抗技术 20165237 Exp6 信息搜集与漏洞扫描
2018-2019-2 网络对抗技术 20165237 Exp6 信息搜集与漏洞扫描 实验目标 1 各种搜索技巧的应用: 2 DNS IP注册信息的查询: 3 基本的扫描技术: 主机发现.端口扫描.O ...
- 【easy】530. Minimum Absolute Difference in BST
找BST树中节点之间的最小差值. /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode ...
- python获取设备主机名和IP地址
import socket def print_machine_info(): host_name = socket.gethostname() ip_address = socket.gethost ...
- C# 文件下载工具类FileDownHelper
using System; using System.IO; using System.Threading; using System.Web; namespace 落地页测试代码 { public ...
- SQLAlchemy+Flask-RESTful使用(三)
前言 顺理成章地,19.3.21起笔了第三章.也就是最近没啥事了,才有时间搞这些.生命不息奋斗不止吧! 变更记录 # 19.3.21 起笔 # 19.3.21 增加 Flask-RESTful如何获取 ...
- 移动端添加横向滚动条&隐藏
添加横向滚动条ul { display: flex; overflow-x: auto; overflow-y: hidden; white-space: nowrap; }隐藏滚动条,保留滚动效果 ...