golang 基础知识3

1. 断言: 参考 https://studygolang.com/articles/3314

var.(T)类型断言失败时会返回T类型的“0值”,而不是变量原始值。 var是要判断的变量,T类型,例如:sss.(string),T是type最好用的是interface或者一个strcut

其中var为interface{}类型 T是要断言的类型。

简单的string可以不使用这个

1)直接断言使用

var a interface{}

a = "xxxx"

fmt.Println("Where are you,Jonny?", a.(string))

但是如果断言失败一般会导致panic的发生。所以为了防止panic的发生,我们需要在断言前进行一定的判断

value, ok := a.(string)     //value在正常值true/false, 如果没错误 ok是没有值的,如果有panic则ok是有值的

if value, ok := a.(string) ,ok {

  fmt.Println(value, ok)   //xxxx,true

}

if value, ok := a.(string) ,ok {

  fmt.Println(value, ok)   

} else {

    fmt.Println(value, ok)   //<nil>, false  如果ok为false则ok为false

}

2.receiver函数的"仿重载",也就是继承的问题,继承不覆盖父的方法

package main

import (
"fmt"
)

type S1 struct{}

func (s1 S1) f() {
fmt.Println("S1.f()")
}
func (s1 S1) g() {
fmt.Println("S1.g()")
}

type S2 struct {
S1
}

func (s2 S2) f() {
fmt.Println("S2.f()")
}

type I interface {
f()
}

func printType(i I) {
fmt.Printf("1,%T\n", i)
if s1, ok := i.(S1); ok {
s1.f()
s1.g()
}
if s2, ok := i.(S2); ok {
s2.f()
s2.g()
}
}

func main() {
printType(S1{})
printType(S2{})
}

3.string转换为[]byte

  s := "123"

  1.取这个字符串的指针   b := []byte(*s | s)  //直接用字符串生成byte的数组,这个时候生成的byte数组的内容就会跟s无关了

  2.修改这个byte的值: b[1] = '0'    //单引号是byte 可以使用这样来修改byte数组的值,s是不会变的

 

posted @ 2018-01-10 15:01  jay-  阅读(103)  评论(0编辑  收藏  举报