目录
array := [4][2]int((10 ,11), {20, 21}, {30, 31}, {40, 41})
上图例子中,类比数学矩阵知识来说,就是创建了4行2列的矩阵(列和行都是从0开始),访问第i行第j列:array[i][j] (0<=i<=3并且0<=j<=1)
在函数传递数组是值传递
s := source[2:3:4]
s := [][]int{{10}, {100, 200}}
标头值为复制而设计
package main
import (
"fmt"
)
//test slice
func test1(s []byte) {
s[1] = 57
}
//test map
func test2(m map[string]int){
m["hello"] = 1
}
//test chan
func test3(c chan int) {
c <- 3
}
//test func
func test4(a func()) {
a()
}
func main() {
s := []byte{56, 56, 56}
test1(s)
fmt.Println(s) //[56 57 56]
m := map[string]int{
"hello": 0,
}
test2(m)
fmt.Println(m) //map[hello:1]
c := make(chan int)
go test3(c)
fmt.Println(<-c) //3
f := func(){
fmt.Println("func!!!")
}
test4(f) //func!!!
}
package main
import (
"fmt"
)
type i1 interface {
func1()
}
type i2 interface {
i1
func2()
}
type s1 struct{}
func (a s1) func1() {
fmt.Println("s1 func1")
}
func (a s1) func2() {
fmt.Println("s1 func2")
}
func main() {
var a i2
a = s1{}
a.func1() //s1 func1
a.func2() //s1 func2
var b i1
b = a
b.func1() //s1 func1
b.func2() //b.func2 undefined (type i1 has no field or method func2)
}
package main
import (
"fmt"
)
type I1 interface {
func1()
}
type I2 interface {
func2()
}
type I interface {
I1
I2
}
type A struct{}
func (a A) func1() {
fmt.Println("A func1()")
}
func (a *A) func2() {
fmt.Println("*A func2()")
}
func main() {
var i1 I1
i1 = A{}
i1.func1() //A func1()
var i2 I2
//i2 = A{} 这样会出错
i2 = &A{}
i2.func2() //*A func2()
//i2.func1() 虽然用了*A类型实现fun2方法,A类型实现了fun1方法,但是接口I2只给出了func2的声明
var i I
i = &A{}
//i = A{} 这样会出错
i.func1() //A func2()
i.func2() //*A func2()
}
package main
import (
"fmt"
)
type A struct{}
func (a A) func1() {
fmt.Println("A func1()")
}
func (a *A) func2() {
fmt.Println("*A func2()")
}
func main() {
t := A{}
t.func1() //A func1()
t.func2() //*A func2()
p := &A{}
p.func1() //A func1()
p.func2() //*A func2()
}
package main
import (
"fmt"
)
type I interface {
func1()
}
type S struct {
A
}
type A struct{}
func (a *A) func1() {
fmt.Println("*A func1")
}
func func2(i I) {
i.func1()
}
func main() {
var s S
//func2(s) 这样是不行的
func2(&s) //*A func1
s.A.func1() //*A func1
s.func1() //*A func1
}
因为内部类型相关的标识符将会提升到外部类型上,而且这个s只是个结构体而不是接口,结构体并不用遵守接口值中方法集的规则,结构体更加自由(fun2的调用可以作出对比)
package main
import (
"fmt"
)
type I interface {
func1()
}
type S struct {
A
}
func (s *S) func1() {
fmt.Println("*S func1")
}
type A struct{}
func (a *A) func1() {
fmt.Println("*A func1")
}
func func2(i I) {
i.func1()
}
func main() {
var s S
//func2(s) 这样是不行的
func2(&s) //*S func1, 这里内部类型不会被提升,优先使用外部类型的方法
func2(&s.A) //*A func1
s.A.func1() //*A func1
s.func1() //*S func1,这样内部类型就不会被提升了
}
package a
type a int
func New(value int) a {
return a(value)
}
package main
import (
"fmt"
"learn/a"
)
func main() {
t := a.New(100)
fmt.Printf("type: %T\nvalue: %d\n", t, t)
//type: a.a
//value: 100
}
"要让这个行为可行,需要两个理由。第一,公开或者未公开的标识符,不是一个值。第二,短变量声明操作符,有能力捕获引用的类型,并创建一个未公开的类型的变量。永远不能显式创建一个未公开的类型的变量,不过短变量声明操作符可以这么做。"
package a
//不公开的a类型
type a struct {
Value int //公开的成员
}
//公开的A类型
type A struct {
a
}
package main
import (
"fmt"
"learn/a"
)
func main() {
var t a.A
t.Value = 10
fmt.Println(t.Value) //这样就访问到了未公开类型a的公开成员了
}
Go语言实战读书笔记(1):多维数组,切片,引用类型,接口,嵌入类型,标识符的可见性
原文:https://www.cnblogs.com/laiyuanjing/p/11273505.html