下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 11 | Map与工厂模式,在Go语言中实现Set
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Go语言从入门到实战

共55讲 · 55课时,约700分钟
6126
免费
01 | Go语言课程介绍
免费
02 | 内容综述
免费
03 | Go语言简介:历史背景、发...
免费
04 | 编写第一个Go程序
免费
05 | 变量、常量以及与其他语言...
06 | 数据类型
07 | 运算符
08 | 条件和循环
09 | 数组和切片
10 | Map声明、元素访问及遍历
11 | Map与工厂模式,在Go语言...
12 | 字符串
13 | Go语言的函数
14 | 可变参数和defer
15 | 行为的定义和实现
16 | Go语言的相关接口
17 | 扩展与复用
18 | 不一样的接口类型,一样的...
19 | 编写好的错误处理
20 | panic和recover
21 | 构建可复用的模块(包)
22 | 依赖管理
23 | 协程机制
24 | 共享内存并发机制
25 | CSP并发机制
26 | 多路选择和超时
27 | channel的关闭和广播
28 | 任务的取消
29 | Context与任务取消
30 | 只运行一次
31 | 仅需任意任务完成
32 | 所有任务完成
33 | 对象池
34 | sync.pool对象缓存
35 | 单元测试
36 | Benchmark
37 | BDD
38 | 反射编程
39 | 万能程序
40 | 不安全编程
41 | 实现pipe-filter framew...
42 | 实现micro-kernel frame...
43 | 内置JSON解析
44 | easyjson
45 | HTTP服务
46 | 构建RESTful服务
47 | 性能分析工具
48 | 性能调优示例
49 | 别让性能被锁住
50 | GC友好的代码
51 | 高效字符串连接
52 | 面向错误的设计
53 | 面向恢复的设计
54 | Chaos Engineering
55 | 结束语
本节摘要
展开

精选留言(17)

  • 2019-03-08
    java的hashset是通过hashmap实现的,存放到hashset中的值,会调用hashcode(key)找到需要存放在底层数组中的位置,然后通过equals(key)判断该值是不是存在,存在的话则表面是重复的,不再继续往set中添加,老师实现set的方式的关键是map[int]bool 中的布尔值默认是false的,这样直接if判断,写出来的代码非常巧妙。
    1
    3
  • 2019-03-08
    set情况下,value只能是true吗?如果为false,判断就会不存在了

    作者回复: 没错,添加元素要设置true

    1
  • 2019-03-08
    请问老师,用map做set时也常用map[type]struct{},更好的实践是哪一种呢?还是根据使用场景来选择?

    作者回复: 我认为map[type]bool更好,代码会更自然,如判断一个元素是否存在 if m[key] {...}

    1
    1
  • 2019-03-07
    java中HashSet内部也是用HashMap实现的
    1
  • 2019-10-17
    1. 试了一下, lambda定义的时候, 形参op是可以省略的

    func TestMapWithFunValue(t *testing.T) {
        m1 := map[int]func(int) int{}
        m1[1] = func(op int) int { return op }
        m1[2] = func(op int) int { return op * op }
        m1[3] = func(op int) int { return op * op * op }
        t.Log(m1[1](2), m1[2](2), m1[3](2))
    }

    2. 用map[type]bool代替set[type]是一个巧妙的技巧, 但也需要意识到 map[key] = false 这种隐患
    展开
  • 2019-08-13
    老师问下,set时候,map后面的花括号的作用是什么,不加也可以吧

    作者回复: 表示创建一个map实例。如果不要花括号可以用make来创建:set := make(map[int]bool)

    1
  • 2019-06-07
    在golang如何实现set的差集,并集,对称差?
  • 2019-05-08
    这个没有验证元素的唯一性吧?

    作者回复: key在map中是唯一的

    1
  • 2019-04-20
    感觉老师写代码的时间太长了,建议多些讲解,把代码打印输出之类的东西简化
  • 2019-04-09
    map set 一并发不就凉凉了
  • 2019-03-25
    怎么实现有序的map,set? 有些场景需要插入和删除的效率在o(logn),有序的map是适合的.
    如果是放入map,再取出来排序的方式,对于写少读多,但需要集合中元素有序的情况,却是不太适合

    作者回复: 你可以参考java的TreeMap的实现方式,自己实现一下

  • 2019-03-16
    老师, 在实现Set时您是用int举例的: map[int]bool, 怎么将key的类型设置为通用类型(类似Java中的泛型), 这样就可以实现一个通用的Set了.
  • 老师:百忙之中,跪请解惑啊

    //===============定义接口=======================
    package interfaces
    type TCPGet interface {
        Get(url string) string
    }
    type TCPPost interface {
        Post(url string) string
    }
    type TCP interface {
        TCPGet
        TCPPost
    }
    //=======定义实现===============================
    package interfaces

    type Http struct {
        Content string
    }

    func (http Http) Get(url string) string {
        return http.Content+"->this is get request"
    }

    func (http Http) Post(url string) string {
        return http.Content+"->this is post request"
    }

    //=================主程序========================

    const url ="http://www.baidu.com"

    func main() {

        var myhttpStruct = interfaces.Http{Content: "接口测试"}
        //接口可以指向实现了该接口的结构体的指针,
        //这个指针通过解地址就可以拿到这个结构体,
    //问题1:老师,go语言中是不是实现了某个接口的结构体的指针都可以使用该接口去接收?
        var http interfaces.TCP = &myhttpStruct
        fmt.Printf("%T , %T ,%T\n",myhttpStruct,http,&http)
        Myrequest(&http) //获取到这个接口的指针,也就是 这个结构体的指针的指针

        var httpx * interfaces.TCP = &(&interfaces.Http{Content: "接口测试"})
           //问题2,老师,为什么这种语法就不行呢?

        fmt.Printf("%T\n",httpx)
    }

    func Myrequest(http * interfaces.TCP) {//这个

        //http 是接口的指针,通过解一次地址获取到的是结构体的指针,通过结构体的指针调用该结构体下的方法
        fmt.Printf("%T , %T\n",http,*http)

        fmt.Println((*http).Get(url))
        fmt.Println((*http).Post(url))
    }
    展开

    作者回复: 第一个问题答案是“是”
    第二个问题是因为
    接口对应的是结构体的指针,我们不使用接口的指针(因为他指向的并不是实现接口的具体类型)

    所以你的方法应该定义为
    func Myrequest(http interfaces.TCP)

  • 2019-03-10
    这节课有点没看懂,set 是干嘛的。只会PHP一门语言。
    1
  • 2019-03-09
    非常赞;但是 能不能在提高下难度哈!

    作者回复: 进阶课程会更有难度。整体课程的宗旨是简明,希望能够让你把其他语言的编程经验快速发挥到Go中,同时,又能掌握Go语言的独特编程特性。

  • 2019-03-08
    同一个文件夹下,多个测试文件就运行不了了
    can't load package: package .: found packages map1 (map1_test.go) and map (map_test.go) in D:\gowork\go_learning\src\ch7\map
    只能是一个吗?

    作者回复: 同以目录下,源码文件中的包名要一样

    1
  • 2019-03-07
    老师能不能推荐一本入门级的书看一下,感觉看课程之余再多看看书才能够更快更好的理解。

    作者回复: head first go