2 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個(gè)贊
給你個(gè)fmt.Printf的例子:
echo 函數(shù)不定參數(shù),其調(diào)用fmt.Printf進(jìn)行輸出,因?yàn)関是一個(gè)slice,所以傳遞給fmt.Printf的時(shí)候需要 v...,就類似append(slice1,slice2...)
package main
import (
"fmt"
)
func main() {
echo("Hello %s, I am %s\n", "Bob", "John")
}
func echo(format string, v ... interface{}) {
fmt.Printf(format, v...)
}

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
Golang的interface,和別的語(yǔ)言是不同的。它不需要顯式的implements,只要某個(gè)struct實(shí)現(xiàn)了interface里的所有函數(shù),編譯器會(huì)自動(dòng)認(rèn)為它實(shí)現(xiàn)了這個(gè)interface。
SICP里詳細(xì)解釋了為什么同一個(gè)接口,需要根據(jù)不同的數(shù)據(jù)類型,有不同的實(shí)現(xiàn);以及如何做到這一點(diǎn)。在這里沒(méi)有OO的概念,先把OO放到一邊,從原理上看一下這是怎么做到的。
先把大概原理放在這里,然后再舉例子。為了實(shí)現(xiàn)多態(tài),需要維護(hù)一張全局的查找表,它的功能是根據(jù)類型名和方法名,返回對(duì)應(yīng)的函數(shù)入口。當(dāng)我增加了一種類型,需要把新類型的名字、相應(yīng)的方法名和實(shí)際函數(shù)入口添加到表里。這基本上就是所謂的動(dòng)態(tài)綁定了,類似于C++里的vtable。對(duì)于SICP中使用的lisp語(yǔ)言來(lái)說(shuō),這些工作需要手動(dòng)完成。而對(duì)于java,則通過(guò)implements完成了這項(xiàng)工作。而golang則用了更加激進(jìn)的方式,連implements都省了,編譯器自動(dòng)發(fā)現(xiàn)自動(dòng)綁定。
- 2 回答
- 0 關(guān)注
- 100 瀏覽
添加回答
舉報(bào)