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语言基础(二)的更多相关文章

  1. C语言基础二(敲打键盘、寻找资料)

    看过很多资料的人,估计发觉了什么,我上篇的基础一其中一个最致命的错误,没有加return 0; 为什么不加,说真的,我留个坑,所以跳跃性的直接说到函数是如何运用的. 上章说到main就是主入口,根据m ...

  2. Java语言基础二

      1.常量的概述和使用 A:什么是常量 B:Java中常量的分类 常量分类为六种:a.”字符串” b.’字符’ c.整数 d.小数 e.boolern(布尔类型) 返回值为 FALSE和TRUE   ...

  3. C语言基础--二维数组

    二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...

  4. C语言基础:二维数组 分类: iOS学习 c语言基础 2015-06-10 21:42 16人阅读 评论(0) 收藏

    二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...

  5. C语言基础二维数组

    (1)二位数组的定义int array[n][m],行下标的取值范围是0~n-1,列下标的取值范围是0~m-1,二维数组最大下标元素是array[n-1][m-1]:如定义一个3行4列的数组 int ...

  6. 01C语言基础(二)

    Day07 笔记 指针和函数: 栈 帧: 当函数调用时,系统会在 stack 空间上申请一块内存区域,用来供函数调用,主要存放 形参 和 局部变量(定义在函数内部). 当函数调用结束,这块内存区域自动 ...

  7. Go语言基础二:常用的Go工具命令

    常用的Go工具命令 Go附带了一下有用的命令,这些命令可以简化开发的过程.命令通常包含的IDE中,从而使工具在整个开发环境中保持一致. go run 命令 go run命令实在开发过程中执行的最常见的 ...

  8. R语言基础(二) 可视化基础

    > which.max(apply(x[c("x1","x2","x3")], 1, sum))49 > x$num[which ...

  9. C语言基础二

    C--顺序程序设计 赋值语句 赋值语句和赋值表达式的区别: if((a = b) > 0) t = 0; 字符数据的输入输出 putchar函数 该函数为字符输出函数,其作用是向终端数出一个字符 ...

  10. C语言基础二 练习

    指出正确标识符 命名 l 只能由26个英文字母的大小写.10个阿拉伯数字0~9.下划线_组成 l 严格区分大小写,比如test和Test是2个不同的标识符 l 不能以数字开头 l 不可以使用关键字作为 ...

随机推荐

  1. 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史(转载)

    转载 https://zhuanlan.zhihu.com/p/49271699 首发于深度学习前沿笔记 写文章   从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 张 ...

  2. list不是模板

    vector和list在命名空间std里,还需要添加声明 using namespace std;

  3. Sql server 用T-sql读取本地数据文件dbf的数据文件

    第一步启用Ad Hoc Distributed Queries  在SQLserver执行以下的语句: exec sp_configure 'show advanced options',1 reco ...

  4. Oracle 里 case 和decode的简单用法

    case 就相想当于C#里面switch    l 列:根据员工的职位,计算加薪后的薪水数据 如果职位是Analyst , 加薪10% 如果职位是Programmer 加薪5% 如果职位是clerk ...

  5. 【汇编语言】Win10 安装 DOXBox0.74

    1.下载package包,有用的只有前两个. 2.解压 masm 压缩文件,我把它解压到D盘. 3.双击 图1 中的 DOXBox 0.74.exe 进行安装. 4.打开 DOXBox0.74 (参考 ...

  6. ‘Host’ is not allowed to connect to this mysql server

    ‘Host’ is not allowed to  connect to this mysql server mysql 数据库不允许远程连接 方法一:修改 host 表 进入mysql数据库,选择m ...

  7. 2018-2019-2 20165337《网络攻防技术》Exp5 MSF基础应用

    一.实践目标 1.一个主动攻击实践 ms08_067 2.一个针对浏览器的攻击 ms13-069 3.一个针对客户端的攻击 adobe (Adobe_toolbutton客户端漏洞) 4.成功应用任何 ...

  8. springboot整合springdata-jpa

    1.简介  SpringData : Spring 的一个子项目.用于简化数据库访问,支持NoSQL 和 关系数据存储.其主要目标是使数据库的访问变得方便快捷. SpringData 项目所支持 No ...

  9. 【medium】990. Satisfiability of Equality Equations 并查集

    Given an array equations of strings that represent relationships between variables, each string equa ...

  10. 错误笔记 对象为null时调用改对象的方法会报错

    对象为null时调用改对象的方法会报错