文档章节

go 基础之基本语法

D_Kim
 D_Kim
发布于 2018/06/29 16:40
字数 878
阅读 5
收藏 0

基本语法

array数组

// 第一种
var x [10]int
x[1]=1
x[9]=10
fmt.Printf("%v",x)
// 第二种
x:=[10]int{1,10}
fmt.Printf("%v\n",x)
fmt.Printf("%v",len(x))

slice动态数组

申明

var x []int

使用:=申明

s:=make([]int,3,5)
fmt.Printf("%v", len(s))
3

3为数组长度,5为建议容量 实际使用中如果超过这个值 底层会自动扩展的

s :=make([]int,3,5)
s = append(s,1,2,3,4)
fmt.Printf("%v", s)
[0 0 0 1 2 3 4]

通过一个数组或已经存在的slice中再次声明

  x :=[10]int{1,2,3,4,5,6,7,8,9,10}
	y :=x[1:3]
	fmt.Printf("%v",y)
[2 3]

map

map必须要make

申明
1.

var student map[string]int
student = make(map[string]int)
student["zhangsan"]=1
fmt.Printf("%v", student)
map[zhangsan:1]
student := make(map[string]int)
student["zhangsan"]=1
fmt.Printf("%v", student)
map[zhangsan:1]

range

用于便捷地遍历容器中的元素

key和value都遍历

student := make(map[string]int)
student["zhangsan"]=1
student["lisi"]=2
student["wangwu"]=3
for i,v := range student{
  fmt.Println(i,v)
}
zhangsan 1
lisi 2
wangwu 3

只遍历value

x := [3]int{1,2,3}
for _,v := range x {
  fmt.Println(v)
}
1
2
3

遍历字符串

x := "zhangsan"
for _,v := range x{
  fmt.Printf("%c\n", v)
}
z
h
a
n
g
s
a
n

函数

简单函数

func main()  {
  a :=1
  b :=2
  a,b = swap(a,b)
  fmt.Printf("%d %d", a,b)
}

func swap(a int, b int) (int,int) {
  return b,a
}
2 1

func getSum(a []int)  (int){
  sum := 0
  for _,v := range a {
    sum+=v
  }
  return sum
}

func main()  {
  a := []int{1,2,3}
  s := getSum(a)
  fmt.Println(s)
}
6

匿名函数

func main()  {
  f := func (x,y int) int  {
    return x+y
  }

  fmt.Println(f(1,2))
}
3

defer

func main()  {
  for i :=1 ; i<5; i++ {
    defer fmt.Println(i)
  }
  fmt.Println("before defer")
}
before defer
4
3
2
1

defer 后面跟着语句块是函数执行结束之前再执行,一般可以用在资源的关闭上。例如:

file.Open("file")
defer file.Close()

defer和匿名函数一起用

func main()  {
  defer func ()  {
    fmt.Println("after defer")
  }()
  fmt.Println("before defer")
}
before defer
after defer

'()'匿名函数后面的()表示执行这个函数的意思等价于下面

func main()  {
  f := func ()  {
    fmt.Println("after defer")
  }
  defer f()
  fmt.Println("before defer")
}

对象

struct

type Person struct{
  name string
  age int
}
type Student struct{
  Person
  speciality string
}
func main()  {
  student := Student{Person{"zhangsan",18},"math"}
  // student := Student{speciality:"math",Person:Person{"zhangsan",18}}
  fmt.Printf("%v\n", student)
  fmt.Printf("%v\n", student.speciality)
  fmt.Printf("%v\n", student.age)
  fmt.Printf("%v", student.Person.name)
}
{{zhangsan 18} math}
math
18
zhangsan

类的初始化

//  指针变量
point := new(Point)
point := &Point{}
point := &Point{x:100,y:100}

// 实例
point := Point{}

类的方法

type Point struct{
  px float32
  py float32
}

func (point *Point) setXY(px,py float32)  {
  point.px = px
  point.py = py
}

func (point *Point) getXY() (float32,float32)  {
  return point.px,point.py
}

func main()  {
  point := new(Point)
  point.setXY(1.2,3.4)
  px,py := point.getXY()
  fmt.Print(px,py)
}
1.2 3.4

接口

在go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口。

把实例赋值给接口

type Animal interface{
  Fly()
  Run()
}

type Bird struct{
}

func (bird Bird) Fly()  {
  fmt.Println("Bird is flying!!!")
}

func (bird Bird) Run()  {
  fmt.Println("Bird is running!!!")
}

func main()  {
  var animal Animal
  bird := new(Bird)
  animal = bird
  animal.Fly()
  animal.Run()
}
Bird is flying!!!
Bird is running!!!

把接口赋值给接口只能把多的赋值给少的

type Animal interface{
  Fly()
  Run()
}
type Animal2 interface{
  Fly()
}

type Bird struct{
}

func (bird Bird) Fly()  {
  fmt.Println("Bird is flying!!!")
}

func (bird Bird) Run()  {
  fmt.Println("Bird is running!!!")
}

func main()  {
  var animal Animal
  var animal2 Animal2
  bird := new(Bird)
  animal = bird
  animal2 = animal      //划重点
  animal2.Fly()
}

类型查询

func main()  {
  var v1 interface{}
  v1 = 6.78
  if v,ok :=v1.(float64); ok {
    fmt.Println(v)
  }

  var v2 interface{}
  v2 = 12
  if v,ok := v2.(float32); ok{
    fmt.Println(v)
  }else {
    fmt.Println("no float32")
  }
}
6.78
no float32
func main()  {
  var v1 interface{}
  v1 = 6.78
  switch v1.(type) {
  case int:
    fmt.Println("this is int")
  case float32:
    fmt.Println("this is float32")
  case float64:
    fmt.Println("this is float64")
  }
}

this is float64

© 著作权归作者所有

下一篇: docker swarm
D_Kim
粉丝 0
博文 32
码字总数 12302
作品 0
深圳
私信 提问
React Native \ WEEX 开发文档汇总

React-Native 开发基础文档 环境构建 参照官方提供文档的指引 集成到现有应用 基本语法 入门基础 组件及api JsX语法基础 React-Native生命周期 ES6基础 promise async/await 状态管理 Redux状...

V1admirMakarov
2018/01/11
0
0
Python基础入门教程,Python学习路线图

给大家整理了套python学习路线图,按照此教程一步步的来学习,肯定会对python有更深刻的认识。或许可以喜欢上python这个易学,精简,开源的语言。此套基础入门教程,不但有视频教程,还有源码...

爱龙猫
2017/07/11
933
1
GO从入门到进阶教程系列 - 研发高性能ORM框架入门

随着GO语言市场占比越来越高,我也开始转向使用GO开发项目;因为GO有好几大优点,比如容并发与协程,消息通讯,丰富的数据类型,函数多返回值,defer延迟处理机制,高性能易用的http服务,编程规范等等...

aielves
03/16
0
0
2019年应该如何学习前端开发?

近两年来,前端开发工程师越来越火了,2019年已经到来了,很多准备入行前端开发工程师的小伙伴们,不知道准备得怎么样了呢? 有的朋友在想方设法的学习,争取在年后的金三银四能靠实力找到一...

WEB开发阿靖
02/16
0
0
python基础语法

首发:个人博客,更新&纠错&回复 接上文ruby基础语法,为在切换语言时查看,迅速习惯写法,记录了一些基本语法,代码在这里。 # -- coding: utf-8 --'''参考:http://www.runoob.com/python/...

祁达方
2015/12/11
48
1

没有更多内容

加载失败,请刷新页面

加载更多

全面兼容IE6/IE7/IE8/FF的CSS HACK写法

浏览器市场的混乱,给设计师造成很大的麻烦,设计的页面兼容完这个浏览器还得兼容那个浏览器,本来ie6跟ff之间的兼容是很容易解决的。加上个ie7会麻烦点,ie8的出现就更头疼了,原来hack ie...

前端老手
17分钟前
3
0
常用快递电子面单批量打印api接口对接demo-JAVA示例

目前有三种方式对接电子面单: 1.快递公司:各家快递公司逐一对接接口 2.菜鸟:支持常用15家快递电子面单打印 3.快递鸟:仅对接一次,支持常用30多家主流快递电子面单打印 目前也是支持批量打...

程序的小猿
20分钟前
6
0
Yii 框架中rule规则必须搭配验证函数才能使用

public $store_id;public $user_id;public $page;public $limit;public $list;public $mch_list;public $cart_id;public $is_community;public $shop_id;public $cart_typ......

chenhongjiang
22分钟前
4
0
Flutter使用Rammus实现阿里云推送

前言: 最近新的Flutter项目有“阿里云推送通知”的需求,就是Flutter的App启动后检测到有新的通知,点击通知栏然后跳转到指定的页面。在这里我使用的是第三方插件Rammus来实现通知的推送,之...

EmilyWu
23分钟前
42
0
Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务

短网址顾名思义就是使用比较短的网址代替很长的网址。维基百科上面的解释是这样的: 短网址又称网址缩短、缩短网址、URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短...

阿里巴巴云原生
38分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部