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
", 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是不会变的