Go语言从入门到面向对象

1.为什么用go:

  • 高性能,高并发
  • 语法简单,学习曲线平缓
  • 丰富的标准库
  • 完善的工具链
  • 静态链接(静态编译)
  • 快速编译;跨平台
  • 垃圾回收(无需考虑内存的分布和释放)

2.开发环境

  • 安装go,进行环境配置
  • 开发环境:
    1.可以选择vscode(需要装配相关插件)
    2.安装Goland,有30天的试用期,以下是下载链接
    https://www.jetbrains.com/go/download/

3.基础语法

3.0 Hello,World!

package main    //程序的入口

import (
   "fmt"         //格式化输入输出,导入fmt包
)

func main() {
   fmt.Println("hello world")        //主函数
}
  • Println输出时,会自动换行;
  • Printf输出时,只需要用%v进行,不需要区分%d,%s
  • 打印结构体时,用%+v,打印结构体字段和值;
  • 用%#v,打印整个结构体包括名字
  • 打印浮点数和c语言一样,用%f

3.1 变量和常量

  • c语言基础类型都有,字符串是内置变量
  • 常量(const)无需类型,类型会在上下文自行判断
  • 变量(var)
    • 变量声明要注意Go和c不同的是Go中的变量类型要写在变量名后,如var a int
    • 变量声明,用:=,类型加在变量名之后,如var b, c int=1,2
   var a = "initial"

字符串定义

   var b, c int = 1, 2  

整型数据

var d = true  

布尔型定义

var e float64

浮点数定义

f := float32(e)

go语言支持科学计数法

const s string = "constant"
const h = 500000000
const i = 3e20 / h

常量无需声明类型

3.2 if…else条件语句

  • 规则和c语言不同的地方:
    • go中,if的判断条件无需加括号
    • if语句必须用{},且不能在同一排
if num := 9; num < 0 {
   fmt.Println(num, "is negative")
} else if num < 10 {
   fmt.Println(num, "has 1 digit")
} else {
   fmt.Println(num, "has multiple digits")
}

3.3 循环

  • go语言中只有for循环,且循环条件无需加括号,其余同c语言相同
  • 该循环不会自动结束,需要用break结束
  • continue用法同c语言相同
for j := 7; j < 9; j++ {
   fmt.Println(j)
}

3.4 switch分支语句

和c语言的不同点:

  • case语句中无需break,便可自动跳出
  • 条件可以在case后加
switch {
case t.Hour() < 12:
   fmt.Println("It's before noon")
default:
   fmt.Println("It's after noon")
}

3.5 go语言数组

  • 切片与python类似,但要注意需要用len找到数组大小
  • append:对数组扩容并赋值
  • map映射:一般用make进行自变量映射,同时随机输出
  • range:快速遍历,返回数组的内容及其下标

3.6 go函数

  • 规则与c语言大同小异,要注意的是传入参数的类型应放在参数名之后
  • 函数里对变量本身进行运算,需传入指针变量
func add2ptr(n *int) {
   *n += 2
}

3.7 指针

  • 指针的定义:和c语言相同(*)

3.8 Map

map 是 go 的一种 Key-Value 类型的数据结构,我们可以通过下面的命令声明一个 map :

m := make(map[string]int)

这里笔者感觉就是Python字典的Go形式

4. 编译

使用 go build 命令编译:

go build main.go

还有一种方法可以直接编译+运行:

go run main.go

5. 关于Go的面向对象

5.1 方法

方法是一个特殊类型的带有返回值的函数。返回值既可以是值,也可以是指针。

package main
import "fmt"

//定义结构体
type person struct {
  name   string
  age    int
  gender string
}

// 方法定义
func (p *person) describe() {
  fmt.Printf("%v is %v years old.", p.name, p.age)
}
func (p *person) setAge(age int) {
  p.age = age
}

func (p person) setName(name string) {
  p.name = name
}

func main() {
  pp := &person{name: "Bob", age: 42, gender: "Male"}
  pp.describe()
  // => Bob is 42 years old
  pp.setAge(45)
  fmt.Println(pp.age)
  //=> 45
  pp.setName("Hari")
  fmt.Println(pp.name)
  //=> Bob
}

方法可以使用点号(.)直接调用,就像 pp.describe 这样。请注意,这个方法的返回值是指针类型。指针类型的返回值不会创建对象的新副本,从而节省了内存。

5.2 接口

Go 的接口是一系列方法的集合。接口有助于将类型的属性组合在一起。参考Java一个经典的面向对象例子,以接口 animal 为例,去实现接口

type animal interface {    //接口定义
  description() string
}

这里定义animal接口

package main

import (
  "fmt"
)

type animal interface {
  description() string
}

type cat struct {
  Type  string
  Sound string
}

type dog struct {
  Type      string
  Poisonous bool
}

func (d dog) description() string {
  return fmt.Sprintf("Poisonous: %v", d.Poisonous)
}

func (c cat) description() string {
  return fmt.Sprintf("Sound: %v", c.Sound)
}

func main() {
  var a animal
  a = dog{Poisonous: true}
  fmt.Println(a.description())
  a = cat{Sound: "Meow!!!"}
  fmt.Println(a.description())
}

在 main 函数中, 我们创建了一个 animal 接口类型的变量 a。我们为 animal 接口指定了 dog 和 cat 两个实例对象,并使用 Println 方法打印 。

6. 引用参考

  • 慕课网
  • Go语言圣经
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值