• 思想的宇屋 置顶
    2018-12-29
    真棒,这篇涉及到了自学go的gopher比较难涉及到的计算机基础和细节 如补码,类型转换异常时的“❓”
    
     5
  • 睡觉💤
    2018-08-24
    正数的补码等于原码,负数的补码才是反码+1
    
     76
  • 咖啡色的羊驼
    2018-08-24
    最开始写go时候也在string上遇到过一个小坑。

    由于是之前是phper,习惯性认为go中len("我")应该等于1,后面发现这个遇到字符串时候代表字节数。
     1
     21
  • 陈悬高
    2018-10-10
    对于大型的代码库来说,能够重构其整体结构是非常重要的,包括修改某些 API 所属的包。大型重构应该支持一个过渡期:从旧位置和新位置获得的 API 都应该是可用的,而且可以混合使用这些 API 的引用。Go 已经为常量、函数或变量的重构提供了可行的机制,但是并不支持类型。类型别名提供了一种机制,它可以使得 oldpkg.OldType 和 newpkg.NewType 是相同的,并且引用旧名称的代码与引用新名称的代码可以互相操作。

    考虑将一个类型从一个包移动到另一个包中的情况,比如从 oldpkg.OldType 到 newpkg.NewType。可以在包 oldpkg 中指定一个新类型的别名 type OldType = newpkg.NewType,这样以前的代码都无需修改。
    展开
    
     18
  • 李皮皮皮皮皮
    2018-08-24
    1.通过类型断言获取变量实际类型value,ok=x.(T),ok表示是否是正确的类型,value是成功转换后的值,但返回值形式不建议使用,可能会导致panic
    2.go不同类型直接不能相互赋值,不存在隐式类型转换,必须显式强转
    3.type newType = oldType定义类型别名,type newType oldType定义新类型
    
     8
  • 时间的奴隶
    2018-10-11
    这节课,是从开始学习该专栏以来,最有价值的一节,没有之一!
    希望剩下的课程,都能像这节课这样有价值!

    作者回复: 尽量做到能让大多数人满意:)

    
     5
  • hello peter
    2018-08-24
    @咖啡色的羊驼 我也是phper,php中strlen('我')的结果应该是3,和go一样,你这习惯应该是js的吧
     1
     4
  • BitInit
    2019-03-20
    对于var str string = "hello 你好",使用len(str)结果是12,因为len(str)显示的string底层字节大小。如果需要str的大小,方法一是len([]rune(str)),将string转为rune切片,方法二是utf8.RuneCountInString(str)。对string进行range遍历时,是以unicode编码遍历的。
    
     2
  • @XP
    2018-08-24
    1.接口之间的类型转换有时只有运行错误,不会有编译错误
    2. 类型别名和原类型完全一样,可以随意命名,增加代码可读性; 拓展外部访问权限,原来的变宽
    不知道理解的对不对
    
     2
  • 沐夜星光
    2020-01-06
    既然有了别名类型,为什么还要再搞个别名再定义,两者的应用场景有什么区别?

    作者回复: 两者都是为了隔离变化。

    别名类型“另起炉灶”的只是名字,主要是向上层应用隐藏下层类型的真实名称。这样一来,下层类型体系在重构的时候就可以换名字了(不会影响到上层代码)。

    类型再定义更彻底一些。主要是为了另外构建一个与潜在类型有所关联(有一定的互操作性)但又不同的类型。基于这个新类型,我们可以构建另外一套操作或者类型体系,而不用去改动潜在类型(或者说潜在类型所在的体系)。

    
     1
  • NoTryNoSuccess
    2019-06-27
    container := map[int]string{0: "zero", 1: "one", 2: "two"}
    value, _ := interface{}(container).(int)
    其实这样也不会报错呀,且value为0并不为nil,其中int也可以为其他任何与目标类型map不一致的类型。
     1
     1
  • 胖子(李杰)
    2019-05-16
    php 里面的strlen('你') 也不是1
    mb_strlen('你') 才是 1
    
     1
  • Hector
    2019-05-10
    string可以被称为MyString2的潜在类型,那他们的区别到底在哪里呢?底层时做的复制动作,但是指针存放的地址不同吗

    作者回复: 我在文章里说了:“潜在类型相同的不同类型的值之间是可以进行类型转换的”。这属于语法规则。

    它们虽然代表着不同的类型,但本质上是同源的。也就是说,它们的底层结构是相同的。在这样情况下,在类型转换时值会被复制,即两个值会在不同的内存地址上。

    
     1
  • 田佳伟
    2018-09-06
    首先你要知道,整数在 Go 语言以及计算机中都是以补码的形式存储的

    这句话应该是:首先你要知道,负数在 Go 语言以及计算机中都是以补码的形式存储的 吧😄

    作者回复: 正数的补码等于其自身。

    
     1
  • hb
    2018-08-29
    受益匪浅
    
     1
  • 小小笑儿
    2018-08-24
    好像golang已经支持名字不同但包含的字段相同的struct直接赋值?别名类型在代码重构中非常有用,例如以前使用的是p.T这个类型,重构过程中需要把它移到p1.T1,这时只需要在p包中定义type T=p1.T1,这样基本之前使用p.T的代码都不用修改。
    
     1
  • 我来也
    2018-08-24
    类型转换感觉跟c差不多。
    类型别名,我知道的三处优点:1.名字可以取的更通俗易懂;2:需要修改数据类型时,只用改定义的那一处地方;3:可以很方便的添加特有方法,以实现某些接口。
    
     1
  • 风一般的梦幻
    2019-10-28
    这一行:"其中的x可以是一个变量,也可以是一个代表值的字面量(比如1.23和struct{}),还可以是一个表达式。" 中的struct{}是否应改为struct{}{}?

    作者回复: 对的,我跟编辑说一下,谢谢。

    
    
  • Bitsman
    2019-04-13
    满满的干货
    
    
  • 赵梓旗
    2019-04-06
    您好,我有一个疑问,我认为文中提到的
    []MyString2 的潜在类型应该是它本身 []Mystring2
    同理,[]string 的潜在类型应该也是它本身 []string
    所以二者潜在类型不同,不能进行类型转换

    参考 https://go101.org/article/type-system-overview.html 中 「Concept: Underlying Types」小节的内容
    展开

    作者回复: 你可以参看一下,Go语言规范:https://golang.google.cn/ref/spec#Types ,这才是根本。

    
    
我们在线,来聊聊吧