zoukankan      html  css  js  c++  java
  • 初识 go 语言:方法,接口及并发

    前言: go语言的第四篇文章,主要讲述go语言中的方法,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示例,可直接运行。


    方法,接口及并发

    方法

    方法就是一类带特殊的接收者(struct)参数的函数

    • 通过 结构体.方法 调用
      示例:
    type city struct {
    	name, address string
    }
    
    func (c city) sysCity() {
    	c.name = "帝都"
    	fmt.Println(c.name, c.address)
    }
    
    func testFunc() {
    	c := city{
    		"北京", "二环",
    	}
    	c.sysCity()
    	fmt.Println(c)
    }
    
    • fmt.Println(c)输出的还是{北京 二环},并没有因为在sysCity()中给c.name赋值而改变结构体的值

    指针接收者

    上面说过可以指针去改变结构体的值,所以也可以通过指针接收者去改变结构体的值

    //就在struct类型前加个*就是获取结构体指针了
    func (c *city) sysCity() {
    	c.name = "帝都"
    	fmt.Println(c.name, c.address)
    }
    
    • 尝试输出一下

    接口

    使用 interface关键字表示一个接口,接口是由一组方法签名定义的集合
    示例:

    //接口
    type adder interface {
    	syso()
    }
    //隐式调用,无需声明
    func (x city) syso() {
    	fmt.Println(x.name, x.address)
    }
    func main() {
    	var var1 adder
    	var2 := city{
    		"长安", "皇城",
    	}
    	var1 = &var2
    	var1.syso()
    	
    	//还可以简写成这样
    	var var3 adder = city{
    		"帝都", "皇城",
    	}
    	var3.syso()
    }
    

    空接口:interface {} 没有方法
    为了判断 一个接口值是否保存了一个特定的类型,类型断言可返回两个值:其底层值以及一个报告断言是否成功的布尔值。
    例:t, ok := i.(T)
    若 i 保存了一个 T,那么 t 将会是其底层值,而 ok 为 true。
    否则,ok 将为 false 而 t 将为 T 类型的零值,程序并不会产生恐慌。

    func main() {
    	var i interface{} = "this go"
    	v, ok := i.(string)
    	fmt.Println(v, ok)
    	v, ok := i.(int)
    }
    

    并发

    命令 go 新起一个线程叫go程,go程相当于另起一个线程
    示例:

    func hello(x string) {
    	for i := 0; i < 5; i++ {
    		time.Sleep(100 * time.Millisecond)
    		fmt.Println(x)
    	}
    }
    func main() {
    	go hello("go")
    	hello("say")
    }
    
    • 输出 say go

    信道

    信道是带有类型的管道,你可以通过它用信道操作符 <- 来发送或者接收值。
    (“箭头”就是数据流的方向)

    func sum(x int, var1 chan int) {
    	sum := x
    	for i := 0; i < 5; i++ {
    		time.Sleep(100 * time.Millisecond)
    		sum = sum + i
    	}
    	var1 <- sum
    }
    func main() {
    	var1 := make(chan int)
    	go sum(10, var1)
    	go sum(20, var1)
    	x, y := <-var1, <-var1
    	fmt.Println(x + y)
    }
    

    ch := make(chan int, 100)

    • 100指定缓冲大小
    • 我的理解就是信道里可以容纳的量
      尝试输出以下两段代码,或者将1改成2,体验下区别:
    func main() {
    	ch := make(chan int, 1)
    	ch <- 21
    	fmt.Println(<-ch)
    	ch <- 100
    	fmt.Println(<-ch)
    }
    
    func main() {
    	ch := make(chan int, 1)
    	ch <- 21
    	ch <- 100
    	fmt.Println(<-ch)
    	fmt.Println(<-ch)
    }
    

    ##结束语 **初识 go 语言系列** - [x] 初识 go 语言 - [x] 初识 go 语言:语法 - [x] 初识 go 语言:数据类型 - [x] 初识 go 语言:方法,接口及并发

    欢迎关注我的公众号
    关注我的公众号

  • 相关阅读:
    深入理解npm run命令,run命令的两条潜规则
    oracle 删除表空间及数据文件方法
    Oracle11g创建表空间和用户,并授权
    java poi 读取excel 获取第一个不隐藏的sheet
    VBS 学习
    VBS 操作Excel
    Selenium + Python操作IE 速度很慢的解决办法
    Selenium打开IE报错“Protected Mode settings...”解决方法
    Robot Framework搭建
    获取一组元素的最后一个
  • 原文地址:https://www.cnblogs.com/cmyxn/p/9332530.html
Copyright © 2011-2022 走看看