ăăăä˝ă§ăăăăçĽăăŞăäşşăŽăăăŤďź
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"
var age = 21
println("My Age Is: $age")
`` `cďź
ćĺĺĺ="ăăźăŻ";
var date = DateTime.Now;
Console.WriteLineďź$ "ăăăŤăĄăŻă{ĺĺ}ďźäťćĽăŻ{date.DayOfWeek}ăäťăŻ{dateďźHHďźmm}ă§ăă"ďź;
# Reasoning of string interpolation vs old school formatting
I used to think it was a gimmick but it is not in fact. It is actually a way to provide type safety for string formatting. I mean compiler can expand interpolated strings into expressions and perform all kind of type checking needed.
### Examples
ĺ¤ć°ďź= "var"
resďź= "123 {variable} 321" // resďź= "123" + variable + "321"
return errors.Newďź "opening config fileďź\ {err}"ďź// return errors.Newďź "opening config fileďź" + err.Errorďźďźďź
var status fmt.Stringer
âŚ
msgďź= "çľäşăšăăźăżăšďź{ăšăăźăżăš}" // msgďź= "çľäşăšăăźăżăšďź" + status.Stringďźďź
vďź= 123
resďź= "value = {v}" // resďź= "value =" + someIntToStringConversionFuncďźvďź
# Syntax proposed
* Using `$` or `{}` would be more convenient in my opinion, but we can't use them for compatibility reasons
* Using Swift `\(âŚ)` notation would be compatible but these `\()` are a bit too stealthy
I guess `{âŚ}` and `\(âŚ)` can be combined into `\{âŚ}`
So, the interpolation of variable `variable` into some string may look like
ăă
Formatting also has formatting options. It may look like
ăă
#### Examples of options
vďź= 123.45
fmt.Printlnďź "value = {vďź04.3}"ďź// value = 0123.450
vďź="ĺ¤"
fmt.Printlnďź "value ='{vďźa50}'"ďź// value='<45ăšăăźăš>ĺ¤'
# Conversions
There should be conversions and formatting support for built in types and for types implementing `error` and `fmt.Stringer`. Support for types implementing
ăżă¤ăăăŠăźăăăżă¤ăłăżăźăă§ă¤ăš{
FormatďźăăŠăźăăăćĺĺďźćĺĺ
}
`` `
čŁéăŞăăˇă§ăłăĺŚçăăăăăŤĺžă§ĺ°ĺ Ľă§ăăžă
%v
ďźďźďźă %T
ăŞăŠăŻăăăžăăďź$ {...}ă ăă使ç¨ă§ăăŞăăŽăŻăŞăă§ăăďź SwiftăŤăŻăă§ăŤ1ă¤ăŽć§ćăJavaScriptă¨KotlinăCďźăăăăŤPerlăăăăžă...ăŞăăă1ă¤ăŽăăŞă¨ăźăˇă§ăłăçşćăăăŽă§ăăďź ćăčŞăżăăăăăă§ăŤĺĺ¨ăăăăŽăŤĺşĺˇăăćšăčŻăăŽă§ăŻăŞăă§ăăăăďź
$ {...}ă ăă使ç¨ă§ăăŞăăŽăŻăŞăă§ăăďź SwiftăŤăŻăă§ăŤ1ă¤ăŽć§ćăJavaScriptă¨KotlinăCďźăăăăŤPerlăăăăžă...ăŞăăă1ă¤ăŽăăŞă¨ăźăˇă§ăłăçşćăăăŽă§ăăďź ćăčŞăżăăăăăă§ăŤĺĺ¨ăăăăŽăŤĺşĺˇăăćšăčŻăăŽă§ăŻăŞăă§ăăăăďź
${âŚ}
ăŽć˘ĺăŽćĺĺăăăĺŻč˝ć§ăăăăăă§ăă ăă¨ăă°ăç§ăŻăăăăžăă
ăžăăçžĺ¨\{
ăŻč¨ąĺŻăăăŚăăžăăă
ăăăŻă fmt.Sprintf
ăĺźăłĺşăăăă大ăăŞĺŠçšăŻăŞăăăă§ăă
ăăăŻă
fmt.Sprintf
ăĺźăłĺşăăăă大ăăŞĺŠçšăŻăŞăăăă§ăă
ăŻăăăăăŻĺŽĺ ¨ăŞăżă¤ăăŽĺŽĺ ¨ć§ăăăčŻăăăăŠăźăăłăšă¨ä˝żăăăă䝼ĺ¤ăŤăŻăăăžăăă éçĺäťăă使ç¨ăăč¨čŞăŤĺŻžăăŚćŁăăăăŠăźăăăăăăžăă
ç§ăçĽăéăăăăŽććĄăŻfmt.Sprintf
ă%v
ă§ä˝żç¨ăăăăăăżă¤ăăťăźăă§ăŻăăăžăăă ĺĺŽĺ
¨ć§ăŤé˘ăăŚăŻćŹčłŞçăŤĺăă§ăă ĺ¤ăăŽĺ ´ĺă注ć桹ăĺŽčŁ
ăăă¨ăăăŠăźăăłăšăĺä¸ăăĺŻč˝ć§ăăăăă¨ăŤĺćăăžăă ç§ăŻä˝żăăăăăŤă¨ăăăăžăăă
ăăăĺŽčŁ ăăăŤăŻăč¨čŞäťć§ă§ăăăšăŚăŽăżă¤ăăŤä˝żç¨ăăćŁç˘şăŞăăŠăźăăăăč¨čż°ăăĺż čŚăăăăžăă ăšăŠă¤ăšăé ĺăăăăăăăŠăźăăăăăćšćłăćąşĺŽăăćć¸ĺăăĺż čŚăăăăžăă ă¤ăłăżăźăă§ăźăšă ăăŁăăŤă ăăăŻăč¨čŞäťć§ă¸ăŽéčŚăŞčż˝ĺ ăŤăŞăăžăă
ăăăŻă严ćšăŽćšćłăĺĺ¨ăă樊ĺŠăćăŁăŚăăăăăăŽčłŞĺăŽ1ă¤ă§ăăăćąşĺŽăăăŽăŻćććąşĺŽč
揥珏ă ă¨ćăăžăă Goă§ăŻăăăŞăĺăŤćąşĺŽăăă§ăŤčĄăăăŚăăăăăăŻćŠč˝ăăć
Łç¨çă§ăă ăăfmt.Sprintf
ă¨%v
ă§ăă
ć´ĺ˛çăŤăćĺĺĺ
ăŽčŁéăćĺăăĺĺ¨ăăŚăăč¨čŞăăăăžăă çšăŤăăăŻPerlă§ăă ăăăăPerlăé常ăŤäşşć°ăŤăŞăŁăççąăŽ1ă¤ă§ăăăăăŻăC et alăŽsprintf()
ă¨ćŻčźăăŚé常ăŤäžżĺŠă ăŁăăăă§ăă ăăăŚă %v
ăŻăžă çşćăăăŚăăžăăă§ăăă ăăăŚăčŁéăĺĺ¨ăăč¨čŞăăăăžăăăć§ćçăŤăŻä¸äžżă§ăăă "text" + v1 + "text"
ăčăăŚăżăŚăă ăăă 揥ăŤăJavaScriptăŻăč¤ć°čĄă§ăăă ${...}
ĺ
ăŽäťťćăŽĺźăŽčŁéăăľăăźăăăăăăŻăăŁăăŻĺźç¨ăŞăăŠăŤăĺ°ĺ
ĽăăžăăăăăăŻă "text" + v1 + "text"
ă¨ćŻčźăăŚĺ¤§ĺš
ăŤćšĺăăăžăăă GoăŤăăăăŻăăŁăăŻăŽč¤ć°čĄăŞăăŠăŤăăăăžăăă ${...}
ăŻăăăžăăă 誰ăç§ăçĽăăŞăäşşăăłăăźăăăŽăă
ăăăăľăăźăăăăŤăŻăăŞăăŽĺŞĺăĺż
čŚă§ăăă¨ăă@ianlancetaylorăŤĺćăăžăăă ĺŽéă fmt.Sprintf
ă¨%v
ăŻăžăăŤăăăĺŽčĄăăžăăďź ç§ăŻăĺ
é¨ă§ăžăŁăăĺăăăŽă¨ăŻç°ăŞăć§ćăŠăăăźăŽăăăŤčŚăăžăă ç§ăŻćŁăăă§ăăďź
ăăăă__ç§ăŻ@ianlancetaylorăŤĺćăăžă__ă fmt.Sprintf
ă%v
ă§ä˝żç¨ăăăŽăĺć§ăŤäžżĺŠă§ăă ăžăăçťé˘ä¸ăŽéˇăăăžăŁăăĺăă§ăăăIMHOăé常ăŤéčŚăŞăŽăŻăGoă§ăŻăă§ăŤć
Łç¨ĺĽă§ăă ăăăŻä¸ç¨ŽăŽGoGoăŤăŞăăžăă äťăŽăăšăŚăŽč¨čŞăăäťăŽăăšăŚăŽćŠč˝ăăłăăźĺŽčŁ
ăăă¨ăGoă§ăŻăŞăäťăŽăăšăŚăŽč¨čŞăŤăŞăăžăă
ăă1ă¤ăăăžăă ćĺĺčŁéăćĺăăĺĺ¨ăăŚăăPerlă§ăŽéˇĺš´ăŽçľé¨ăăăăăăŻăăăťăŠĺŽç§ă§ăŻăŞăă¨č¨ăăžăă ăăăŤăŻĺéĄăăăăžăă ĺç´ă§äşç´°ăŞăăă°ăŠă ăŽĺ ´ĺăăăăŚăăăăăăšăŚăŽăăă°ăŠă ăŽ90ďź
ăŽĺ ´ĺăĺ¤ć°ăŽćĺĺčŁéăŻĺéĄăŞăćŠč˝ăăžăă ăăăăă¨ăăŠăvar=1.99999999999
ăĺĺžăăăăă1.99
ă¨ăăŚĺşĺăăăĺ ´ĺăć¨ćşăŽćĺĺčŁéă§ăŻ__ă§ăăžăă__ă äşĺăŤĺ¤ćăčĄăĺż
čŚăăăăžăăăžăăŻ...ăăăĽăĄăłăă調ăšăŚăéˇăéĺżăăăăŚăăsprintf()
ć§ćăĺĺŚçżăăŚăă ăăă ăăă§__is__ĺéĄ-ćĺĺčŁéă使ç¨ăăă¨ăsprintfďźďźăŽăăăŞć§ćăŽä˝żç¨ćšćłăĺżăăăă¨ăă§ăăăăăăăăăŻé常ăŤĺĺ¨ăăžăă ăăăŚăăăăĺż
čŚăŞă¨ă-ăăŞăăŻćăĺç´ăŞăă¨ăăăăŽăŤăăžăăŤăĺ¤ăăŽćéă¨ĺ´ĺă貝ăăăžăă ç§ăŻPerlăŽćčă§čŠąăăŚăăăŽă§ăăăăăăăăŽăŻč¨čŞč¨č¨č
ăŽćąşĺŽă§ăăă
ăăăăĺ˛ç˘ă§ăŻăĺĽăŽćąşĺŽăăŞăăăžăăă %v
fmt.Sprintf
ďź$ăŻăă§ăŤăăăŤăăăčŁéăăăćĺĺă¨ĺăăăăäžżĺŠă§ăçă__ă§ăăăžăăăăăĽăĄăłăăäžăăăăăĺ ´ćăŤăăă¨ăăçšă§__idiomatic__ă§ăă ăăăŚă1.9999999999ă1.99ă¨ăăŚĺ°ĺˇăăćšćłăćçľçăŤĺżăăă¨ăăĺéĄăŤćŠăžăăăăă¨ăŻăăăžăăă
ććĄăăăć§ćăĺ°ĺ Ľăăă¨ăGoăŻSwiftăJavaScriptăŤĺ°ăäźźăăăŽăŤăŞăăä¸é¨ăŽäşşăŻăăă弽ăăăăăăžăăă ăăăăăăŽçšĺŽăŽć§ćăŻăĺ°ăćŞăăŻăŞăăŤăăŚăăăăăčŻăăăăă¨ăŻăŞăă¨ćăăžăă
çŠäşăĺ°ĺˇăăć˘ĺăŽćšćłăŻăăŽăžăžăŤăăŚăăăšăă ă¨ćăăžăă ăăăŚă誰ăăăăŁă¨ĺż čŚăŞĺ ´ĺăŻăăăŽăăăŽăăłăăŹăźăăăăăžăă
ăăă§ăŽč°čŤăŽä¸é¨ăăłăłăă¤ăŤćăŽĺŽĺ
¨ć§ă§ăăĺ ´ĺăăăă誏ĺžĺăŽăăč°čŤă§ăăăă¨ăŤĺćăăžăăă go vet
ăăăăłćĄĺźľćŠč˝go test
ăŻăăă°ăăăŽéă fmt.Sprintf
ăŽčޤăŁă使ç¨ăŤăăŠă°ăçŤăŚăŚăăžăăă
ćŹĺ˝ăŤĺż
čŚăŞĺ ´ĺăŻă go generate
ă使ç¨ăăŚäťćĽăŽăăăŠăźăăłăšăćéŠĺăăăă¨ăă§ăăžăă ăăăŻăăťă¨ăăŠăŽĺ ´ĺ䞥ĺ¤ăăŞăăăŹăźăăŞăă§ăă ăšăăăŻă大ĺš
ăŤćĄĺ¤§ăăĺ ´ĺăĺć§ă ă¨ćăăžăă ăăŹăźăăŞăăŻä¸čŹçăŤäžĄĺ¤ăăăăžăăă
čŁéăăăćĺĺĺ
ă§é˘ć°ĺźăłĺşăă訹ĺŻăăăŽăŻćŽĺżľăŞăă¨ă§ă-čŚéăăăĄă§ăă
ăăăă訹ĺŻăăŞăăă¨ăŻăăă1ă¤ăŽä¸čŚăŞçšćŽăŞăąăźăšă§ăă
ăăă§ăŽč°čŤăŽä¸é¨ăăłăłăă¤ăŤćăŽĺŽĺ ¨ć§ă§ăăĺ ´ĺăăăă誏ĺžĺăŽăăč°čŤă§ăăăă¨ăŤĺćăăžăăă go vetăă˛ăăŚăŻgo testăŻăăă°ăăăŽéăfmt.SprintfăŽčޤăŁă使ç¨ăŤăăŠă°ăçŤăŚăŚăăžăăă ćŹĺ˝ăŤĺż čŚăŞĺ ´ĺăŻăgogenerateă使ç¨ăăŚäťćĽăŽăăăŠăźăăłăšăćéŠĺăăăă¨ăă§ăăžăă ăăăŻăăťă¨ăăŠăŽĺ ´ĺ䞥ĺ¤ăăŞăăăŹăźăăŞăă§ăă ăšăăăŻăĺ¤§ĺš ăŤćĄĺ¤§ăăĺ ´ĺăĺć§ă ă¨ćăăžăă ăăŹăźăăŞăăŻä¸čŹçăŤäžĄĺ¤ăăăăžăăă
ăă ăăĺăŽĺŽĺ ¨ć§ăŻăăăźăŤă§ăŻăŞăăłăłăă¤ăŠăŤăăŁăŚäżč¨źăăăĺż čŚăăăăžăă ăăăŻăťăăłăăŁăŻăšă§ăă ăăăŻăăŞăăˇă§ăłăć示çăŤnull訹厚ĺ¤ă厣č¨ăă䝣ăăăŤănullăă§ăăŻăĺżăăĺ ´ćă確čŞăăăăăŽăăźăŤăĺż čŚă ă¨č¨ăŁăŚăăăăăŞăăŽă§ăă
ăăă¨ăŻĺĽăŤăăăăĺŽĺ
¨ăŤăăĺŻä¸ăŽćšćłăŻăäžĺĺă使ç¨ăăăă¨ă§ăă ćĺĺčŁéăŻă fmt.Sprintf
ă¨ĺăăăŽăŽçłčĄŁć§ćă§ăăăç§ăŻăăšăŚčŻăç çłăŤčłćă§ăăăgoăłăăĽăăăŁĺ
¨ä˝ăŻăăă§ăŻăŞăăăă§ăă
ăăăăŻăfmt.Printfă¨ăăŽäť˛éăăĄă¨ăăžăćŠč˝ăăăăăŤč¨čŞăĺ¤ć´ăăăăăŞăăŽăăăăăžăăă
fmtă%(foo)v
ă%(bar)q
ăŽăăăŞăăŽăăľăăźăăăŚăăĺ ´ĺăŽăăăŤăĺŻĺ¤ĺĺźć°é˘ć°/ăĄă˝ăăăŽĺźăłĺşăă§%(<ident>)
ăĺŤăćĺĺăŞăăŠăŤă使ç¨ăăăŚăăĺ ´ĺăĺç
§ăăăŚăăăăšăŚăŽăˇăłăăŤăŻĺŻĺ¤ĺĺźć°ăŞăšăăŤčŞĺçăŤčż˝ĺ ăăăžăă
äžďźăăŽăłăźăďź
name := "foo"
age := 123
fmt.Printf("The gopher %(name)v is %(age)2.1f days old.")
ćŹĺ˝ăŤăłăłăă¤ăŤăăžăďź
name := "foo"
age := 123
fmt.Printf("The gopher %(name)v is %(age)2.1f days old.", name, age)
ăăăŚă fmt
ăŻăä¸čŚăŞ(name)
ďź$ăăăă¨(age)
ăăăăăšăăăăăăă¨ăă§ăăžăă
ăă ăăăăăŻé常ăŤçšćŽăŞăąăźăšăŽč¨čŞĺ¤ć´ă§ăă
ç§ăŤă¨ăŁăŚăč¨čŞăŤćĺĺčŁéăĺŤăăççąă¨ăăŚăŽăżă¤ăăă§ăăŻăŻăăăťăŠé
ĺçă§ăŻăăăžăăă fmt.Printf
ăŤĺ¤ć°ăć¸ăčžźăé ĺşăŤäžĺăăŞăăăăéčŚăŞççąăăăăžăă
ććĄăŽčŞŹćăăäžăŽ1ă¤ăĺăä¸ăăŚăćĺĺčŁéă使ç¨ăăĺ ´ĺă¨ä˝żç¨ăăŞăĺ ´ĺăŽGoă§č¨čż°ăăžăă
name := "Mark"
date := time.Now()
fmt.Printf("Hello, %v! Today is %v, it's %02v:%02v now.", name, date.Weekday(), date.Hour(), date.Minute())
name := "Mark"
date := time.Now()
fmt.Printf("Hello, %{name}! Today is %{date.Weekday()}, it's %02{date.Hour()}:%02{date.Minute()} now.")
ç§ăŤă¨ăŁăŚă2çŞçŽăŽăăźă¸ă§ăłăŻăĺ¤ć°ăć¸ăčžźăé ĺşăŤäžĺăăŞăăăăčŞăżĺăă¨ĺ¤ć´ăç°Ąĺă§ăă¨ăŠăźăçşçăăŤăăăŞăŁăŚăăžăă
ćĺăŽăăźă¸ă§ăłăčŞăă¨ăăŻăčĄăć°ĺčŞăżç´ăăŚćŁăăăă¨ă確čŞăăĺż čŚăăăăžăăçŽăĺĺžăŤĺăăăŚăăďź văăŽä˝ç˝Žă¨é 罎ăăĺż čŚăŽăăĺ ´ćăŽéăŤăĄăłăżăŤăăăăłă°ăä˝ćăăžăăĺ¤ć°ă
ç§ăŻăăăźăżăăźăšăŻă¨ăŞăĺ¤ăăŽăďźăă§č¨čż°ăăăŚăăăăă¤ăăŽă˘ăăŞăąăźăˇă§ăłďźGoă§č¨čż°ăăăŚăăžăăăăĺăĺéĄă§ďźăŽăă°ă俎ćŁăăŚăăžăăă ĺĺäťăăăŠăĄăźăżăźďź SELECT * FROM ? WHERE ? = ? AND ? != false ...
ďźăŽäťŁăăăŤăăăăŤĺ¤ć´ăĺ ăăă¨ďźgităăźă¸ä¸ăŤä¸ćł¨ćă§ăăďźă2ă¤ăŽĺ¤ć°ăŽé ĺşăĺ蝢ăăžăăđŠ
ăăăăŁăŚăéˇćçăŞäżĺŽć§ă厚ćăŤăăăă¨ăçŽçă¨ăăč¨čŞăŽĺ ´ĺăăăŽççąăăăćĺĺčŁéăć¤č¨ăă䞥ĺ¤ăăăă¨ćăăžăă
ăăăŽč¤éăăŤă¤ăăŚďźGoăłăłăă¤ăŠăŽĺ é¨ăăăăăŞăăŽă§ăä¸č¨ă§č¨ăă°ă_ä¸č¨ăŽäžă§ç¤şăă2çŞçŽăŽăăźă¸ă§ăłăćĺăŽăăźă¸ă§ăłăŤĺ¤ćăăă ăă§ăŻăŞăă§ăăăăďź_
@ianlancetaylorăŻăä¸č¨ăŽăšăąăăďźhttps://github.com/golang/go/issues/34174#issuecomment-532416737ďźăŻăĺä˝ăĺ¤ć´ăăăăžăăŞăăă°ăŠă ăăăĺŻč˝ć§ăăăăăăĺłĺŻăŤăŻä¸ä˝äşćć§ăăŞăăă¨ăććăăžăăă
ä¸ä˝äşćć§ăŽăăăăŞă¨ăźăˇă§ăłăŻăăă¨ăă°f
ă¨ăăăăŹăăŁăăŻăšăäťăăć°ăăăżă¤ăăŽăăăŠăźăăăăăăćĺĺăŞăăŠăŤăăčż˝ĺ ăăăă¨ă§ăă
äžďźăăŽăłăźăďź
name := "foo"
age := 123
fmt.Printf(f"The gopher %(name)v is %(age)2.1f days old.")
ćŹĺ˝ăŤăłăłăă¤ăŤăăžăďź
name := "foo"
age := 123
fmt.Printf(f"The gopher %(name)v is %(age)2.1f days old.", name, age)
ăă ăă2ĺăŽf
ďź Printf
ăŤ1ă¤ăć°ăăăżă¤ăăŽćĺĺăŞăăŠăŤăŽĺăŤf
ăçśăďźăŻéĺăăžăă
ăžăăăłăłăă¤ăŠăŽĺ
é¨ĺä˝ăç解ăăŚăăŞăăŽă§ăďźăăăăă°ăăăŚďźăăăăłăłăă¤ăŠăŤĺŽčŁ
ă§ăăă¨ćăăžăă
fmt.printf("Hello %s{name}. You are %d{age}")
ĺçăŽçžĺ¨ăŽĺŽĺźĺăŤăłăłăă¤ăŤăăăžăă
ćĺĺčŁéăŤăŻăčŞăżăăăăĺä¸ăăă¨ăăćăăăŞĺŠçšăăăďźGoăŽăłă˘č¨č¨ăŽćąşĺŽďźăĺŚçăăćĺĺăéˇăč¤éăŤăŞăăŤă¤ăăŚăšăąăźăŞăłă°ăĺä¸ăăžăďźGoăŽĺĽăŽăłă˘č¨č¨ăŽćąşĺŽďźă {age}ă使ç¨ăăă¨ăćĺĺăăšăă čŞăżĺăăăă ăăŽĺ ´ĺďźăăăŚăăĄăăćĺŽăăăăżă¤ăăçĄčŚăăĺ ´ĺďźăŤăŻăŞăćĺĺăłăłăăăšăăĺžăăăăă¨ăŤă注ćăăŚăă ăăăćĺĺăŻăăăŞăăŻčăéŤăăă§çľăăŁăŚăăĺŻč˝ć§ăăăăžăă ăăăŞăăŻ[XXXăŽĺ ´ćăŤăă]ăăăăăŞăăŻä¸çć¸ĺ˝ĺăăŚăăžăăăăăăŚăăŠăźăăăăĄă˝ăăăčŁéăŽĺă¤ăłăšăżăłăšăŤăăăăłă°ăăăăăŤç˛žçĽçăŞă¨ăăŤăŽăźăćĺ ĽăăŞăéăăăăăŤä˝ăăăšăăăŻăăăŤăŻăăăăžăăă ăăŽďźç˘şăăŤĺ°ăăďźç˛žçĽçăŞăăźăăŤăĺăé¤ăăă¨ăŤăăăăăă°ăŠăăźăŻăłăźăă§ăŻăŞăăă¸ăăŻăŤéä¸ăăăă¨ăă§ăăžăă
ăłăłăă¤ăŠăŻč¨čŞäťć§ăĺŽčŁ ăăžăă č¨čŞäťć§ăŻçžĺ¨ăfmtăăăąăźă¸ăŤă¤ăăŚä˝ăčż°ăšăŚăăžăăă ăăĺż čŚăŻăăăžăăă fmtăăăąăźă¸ăăžăŁăă使ç¨ăăŞă大čŚć¨ĄăŞGoăăă°ăŠă ăä˝ćă§ăăžăă fmtăăăąăźă¸ăŽăăăĽăĄăłăăč¨čŞäťć§ăŤčż˝ĺ ăăă¨ăăăăčăă大ăăăŞăăžăăăăăŻăč¨čŞăăŻăăăŤč¤éăŤăŞăă¨ăăĺĽăŽč¨ăćšă§ăă
ăăă§ăăŽććĄăćĄç¨ăăăă¨ăŻä¸ĺŻč˝ă§ăŻăăăžăăăăăăăŻĺ¤§ăăŞăłăšăă§ăăăăăŽăłăšăăä¸ĺăăŤăŻĺ¤§ăăŞĺŠçăĺż čŚă§ăă
ăžăăŻăfmtăăăąăźă¸ă使ç¨ăăăŤćĺĺčŁéăŤă¤ăăŚčŞŹćăăćšćłăĺż
čŚă§ăă ăăăŻăćĺĺĺăŽĺ¤ăăžăăŻ[]byte
ĺăŽĺ¤ăŤă¤ăăŚăŻăăŞăć確ă§ăăăäťăŽĺăŽĺ¤ăŤă¤ăăŚăŻăăăťăŠć確ă§ăŻăăăžăăă
@IanLanceTaylorăä¸č¨ă§čż°ăšăăă¨ă¨ăăăŠăźăăăăŞăăˇă§ăłă使ç¨ăăŚč¤éăŞĺźăčŁéăăăă¨ăăă¨ăčŞăżăăăăŽĺŠçšăăŚăŁăłăăŚăŽĺ¤ăŤĺşăĺžĺăăăăăăăăŽććĄăŤăŻčłćă§ăăžăăă
ăžăăé˘ć°ăŽfmt.Print
ďźăăăłPrintln
ďźăăĄăăŞăźăŤĺŻĺ¤ĺĺźć°ăĺŤăăćŠč˝ăŤăăăăă形ĺźăŽčŁéăăă§ăŤćĺšăŤăŞăŁăŚăăăă¨ăĺżăăăă¨ăăăăžăă ĺăŤĺźç¨ăăäžăŽăăă¤ăăŻăç§ăŽčăă§ăŻĺăăăăŤčŞăżăăă揥ăŽăłăźăă§ç°ĄĺăŤĺçžă§ăăžăă
multiplier := 3
message := fmt.Sprint(multiplier, " times 2.5 is ", float64(multiplier) * 2.5)
age := 21
fmt.Println("My age is:", age)
name := "Mark"
date := time.Now()
fmt.Print("Hello, ", name, "! Today is ", date.Weekday(), ", it's ", date.String()[11:16], " now.\n")
name = "foo"
days := 12.312
fmt.Print("The gopher ", name, " is ", fmt.Sprintf("%2.1f", days), " days old\n.")
ăăă§ăč¨čŞă§čż˝ĺ ăăŚ__have__ăăăă1ă¤ăŽççąďź https ďź//github.com/golang/go/issues/34403#issuecomment -542560071
https://github.com/golang/go/issues/34174#issuecomment-540995458ăŤăă@alanfoăŽăłăĄăłăăŻčŞŹĺžĺăăăăžăfmt.Sprint
ă使ç¨ăăŚĺç´ăŞç¨ŽéĄăŽćĺĺčŁéăčĄăăă¨ăă§ăăžăă ć§ćăŻăăăăăăžăäžżĺŠă§ăŻăăăžăăăăăăŽćšćłă§ăŻăăŠăŽăăăŞĺ ´ĺă§ăĺ¤ć°ăčŁéăăăăăŽçšĺĽăŞăăźăŤăźăĺż
čŚăŤăŞăăžăă ăžăăĺčż°ăŽăăăŤăăăăŤăăăĺ¤ăŽäťťćăŽăăŠăźăăăăčŁéă§ăăžăă
ä¸č¨ăŽăăăŤăăăăăťăźčĄăăăăŽć˘ĺăŽćšćłăăăăĺă ăŽĺ¤ć°ăŽăăŠăźăăăăĺŻč˝ă§ăă ăăăăŁăŚăăăăŻăăăăć¸ĺ°ă§ăă ćçľçăŞăłăĄăłăăŽăăăŤ4éąééăăăžăžăŤăăžăă
ç§ăŻĺŽćçăŤăćżĺ
Ľăăĺ¤ć°ă50ăăŻăăăŤčś
ăăăăăšăăăăăŻăŽä˝ćăŤç´é˘ăăŚăăžăă ăăă¤ăăŽăąăźăšă§ăŻ70䝼ä¸ă ăăăŻăPythonăŽfćĺĺďźä¸č¨ăŽCďźă¨ĺć§ďźă使ç¨ăăŚç°ĄĺăŤçśćă§ăăžăă ăăăăăăă¤ăăŽççąăăăPythonă§ăŻăŞăGoă§ăăăĺŚçăăŚăăžăă ăăăăŽăăăăŻă玥çăăăăăŽfmt.Sprintf
ăŽĺćč¨ĺŽăŻ...ăăăăžăăă ăăăăçĽăŻç§ăééăă俎ćŁăăăă %anything
ăăźăŤăźă¨ăăŽä˝ç˝ŽăŤé˘éŁăăĺ¤ć°ă秝ĺăžăăŻĺé¤ăăăă¨ăĺŤăä˝ăăăŽćšćłă§ăăăšăăĺ¤ć´ăăŞăăă°ăŞăăŞăăă¨ăçŚăăŚăăžăă ăžăă template
ăŤć¸Ąăăăăăćĺă§ä˝ćăăăă os.Expand
ăč¨ĺŽăăăăăăă¨ăăĺŞăăăŞăăˇă§ăłă§ăŻăăăžăăă ććĽăĺăăăďźăťăăă˘ăăăŽďźé庌ă¨f-stringăŽäżĺŽć§ăŽĺŽšćăăfmt.Sprintf
䝼ä¸ăŤăăžăă ăăăă fmt.Sprint
ăŻăăăťăŠćçă§ăŻăăăžăăă ăăŽĺ ´ĺă fmt.Sprintf
ăăăăťăăă˘ăăăç°Ąĺă§ăă ăăăă埌ăŤéŁăłčžźăă ăéŁăłĺşăăăăăăăăčŚčŚçăŤăŻăăŽćĺłăŽĺ¤ăă夹ăăăžăă "My {age} is not {quality} in this discussion"
ăŻă "My ", age, " is not ", quality, " in this discussion"
ăŽăăăŤćĺĺăŤéŁăłčžźăă ăéŁăłĺşăăăăăăă¨ăŻăăăžăăă çšăŤä˝ĺăăŽĺčćçŽăŽéç¨ă§ă ăăăšăă¨ĺç
§ă秝ĺăăăŤăŻăfćĺĺăăłăăźăăŚč˛źăäťăăă ăă§ăă ĺé¤ăŻé¸ćăăŚĺé¤ăăă ăă§ăă ăăŞăăŻăă¤ăćĺĺăŽä¸ăŤăăăăă§ăă ăăăŻă fmt.Sprint
ă使ç¨ăăĺ ´ĺăŤăŻĺ˝ăŚăŻăžăăžăăă 誤ăŁăŚďźăžăăŻĺż
çśçăŤďźćĺĺ䝼ĺ¤ăŽăłăłăăžăăŻäşéĺźç¨çŹŚă§ĺ˛ăžăăćĺĺăŽçľäşăé¸ćăăăăŠăźăăăă解é¤ăăŚ_ĺ
ăŽĺ ´ćăŤăăăľăźă¸ăă_ăăăŤçˇ¨éăčŚćąăăăă¨ăŻé常ăŤç°Ąĺă§ăă ăăăăŽĺ ´ĺăŽfmt.Sprint
ă¨fmt.Sprintf
ăŻăfćĺĺăŤäźźăăăŽăăăăŻăăăŤćéăăăăăă¨ăŠăźăçşçăăăăăŞăăžăă
ăăăŻăăŞăćăăăäťäşăŽăăăŤčăăăžăăăăăŞăăŻăăăăăžăďź
ăăŽăăăŞĺéĄăŤç´é˘ăăĺ ´ĺăćĺăŻç˘şăăŤtext/template
ăŽčŚłçšăăčăăŚăăă§ăăăăăăăăŻăĺ¤ć°ăć§é ä˝ăăăăăŤĺ
ĽăăăŽăé˘ĺăŞĺ ´ĺăŻăăăăăfmt.Sprint
ă弽ăă§ăăăă fmt.Sprintf
ă§ăăăăłăźăăŻćŹĄăŽăăăŤé
罎ăăžăă
s := fmt.Sprint(
text1, var1, // comment 1
text2, var2, // comment 2
....,
text70, var70, // comment 70
text71,
)
ăăăŻĺ¤ăăŽçťé˘é ĺăĺ ćăăžăăăééăăçŻăăŞăšăŻăăăžăăŞăăŽă§ăçŠäşăĺ¤ć´ăĺé¤ăăžăăŻç§ťĺăăăŽăŻćŻčźçç°Ąĺă§ăă
ăăă¤ăăŽgoćĺĺčŁéăŠă¤ăăŠăŞăăăăžăăăĺ ąç¨ä˝ĺăă¸ă§ăăŞăăŻăšăŞăŠăŽč¨čŞćŠč˝ăăŞăăăăäťăŽč¨čŞăťăŠćčťă§ăćľĺçă§ăăăăžăăă
package main
import (
"fmt"
"github.com/imkira/go-interpol"
)
func main() {
m := map[string]string{
"foo": "Hello",
"bar": "World",
}
str, err := interpol.WithMap("{foo} {bar}!!!", m)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println(str)
}
ăžăăŻă go.uber.org / yarpc / internal / interpolate
çš°ăčżăăŤăŞăăžăăă template/text
ă使ç¨ă§ăăăăăŤăăăăä˝ćăăă¨ăăľăźăăăźăăŁăŽăŠă¤ăăŠăŞăžăăŻos.Expand
ăŽćĺ°éăŽăˇăšăă ăăĺ¤ć°ç¨ăŤä˝ćăăĺż
čŚăŽăăăăźă50ĺ䝼ä¸ăŞăĺ ´ĺăŤćéŠă§ăăĺéĄăŽăłăźăăŽćŽăăŽé¨ĺăŤăŻăă§ăŤĺĺ¨ăăŚăăžăă ăăăŚăăăŽćŠč˝ăŤĺŻžăăĺŻä¸ăŽćŹĺ˝ăŽč°čŤăŻăăďź
ăăŠăźăăăăéŠĺăŤä˝żç¨ăăćšćłăĺżăăĺŻč˝ć§ăăăăă§ăăăĺšçăçšç°ć§ăŞăŠă羜寞ăŤĺż
čŚăŞ1ă¤ăŽă¤ăłăšăżăłăšăŽăăŠăźăăăăć¤ç´˘ăăăăăŤGoogleă使ç¨ăăŚăăăŤ2ĺă貝ăăĺż
čŚăăăăăăăăžăăfmt.Sprintf
ďź ä¸ćšăăťă¨ăăŠăŽĺ ´ĺăĺšçăçšç°ć§ăăžăăŻfmt.Sprintf
ăŽăăăăăĺż
čŚă§ăăă常ăŤä˝żç¨ăăăăăăăŠăźăăăăăžăŁăăĺżăăŞăă§ăă ăăă ĺéĄăŻăăăăžăăă
äťăŽč°čŤăŻăăăč¨čŞăăăč¤éăŤăăă¨ăăăă¨ă§ăăďź ăŻăăăăă§ăă ćčĄçăŤăŻăč¨čŞăŤčż˝ĺ ăăă¨č¤éăăĺ˘ăăžăă ăăăŚăç§ăŻăăšăŚăäşç´°ăŞççąă§č¨čŞăăăč¤éăŤăăŞăăă¨ăŤčłćă§ăă ç§ăŻ_REALLY_ă§ăPythonă§ä˝żç¨ăăăăăšăŚăŽćšćłă§in
ă使ç¨ăăăă¨ăćăă§ăăžăă ăăăăç§ăŻ:= range
ăin
ăŤç˝Žăćăăă ăă§č§Łćąşăăžăă ç§ăŻăăŽ1ĺš´éăPythonăŤăťă¨ăăŠč§ŚăăŚăăăă2ĺš´ĺăŤăă使ç¨ăăŚăăžăăă§ăăă ăăăă10ĺăŽăăĄ9ĺăŻăćĺăŤin
ă¨ĺ
ĽĺăăŚăăă := range
ă§äżŽćŁăăžăă ăăăăç§ăŻăăăăăăŁăŚćŚăă¤ăăăŻăăăžăăă := range
ăŻă䝼ĺăŤä˝ćăăăłăźăăć¨čŤăăăŽăŤĺĺă§ćç˝ă§ăă ăăăăfăšăăŞăłă°ă¨ăăŽç¨ŽéĄăŻăžăŁăăç°ăŞăăžăă ăăăăăźăăłă˘ăŽćŠč˝ă使ăăăăăăăăŚäżĺŽć§ă§ăă ăăăŻçľśĺŻžăŤGoäťć§ăŽä¸é¨ă§ăăĺż
čŚăăăăžăă ăľăźăăăźăăŁăŽăŠă¤ăăŠăŞă¨ăăŚăăăčĄăăăăŽć˝č¨ăăăă°ăç§ăŻăŠă¤ăăŠăŞăä˝ćăăŚăăă§çľăăăžăă ăăăăç§ăŽçĽăéăăGoč¨čŞă¸ăŽčż˝ĺ ăŽćĄĺźľăŞăă§ăŻĺŽçžĺŻč˝ă§ăŻăăăžăăă ăăăăŁăŚăĺ°ăŞăă¨ăăč¨čŞă¸ăŽćĄĺźľăčĄăăăăšăă ă¨ćăăžăă
@runeimp "My {age} is not {quality} in this discussion"
ăŽăľăăźăăéĺ§ă§ăăă¨ăăăăŞăăŽććĄăćŠč˝ăăŞăăă¨ăć確ăŤăăŚăăăăă¨ćăăžăă ăăăŻäťćĽćĺšăŞGoćĺĺă§ăăă age
ă¨quality
ăčŁéăăă¨äşćłăăăĺ ´ĺăć˘ĺăŽGoăăă°ăŠă ăç ´ćăăžăă "My \{age} is not \{quality} in this discussion"
ăŽăăăŞăăŽă§ăŞăăă°ăŞăăžăăă ăžăăćĺĺ䝼ĺ¤ăŽĺ¤ăŽăăŠăźăăăăŽĺéĄăŻćŽăŁăŚăăžăă
@ianlancetaylorăŤćčŹăăžăă ć確ăŤăăăăăŤăPythonăŽfćĺĺăŻf"My {age} is not {quality} in this discussion"
ăžăăŻF'My {age} is not {quality} in this discussion'
ăăăăăŻf
ă¨ä¸éĺźç¨çŹŚăžăăŻäşéĺźç¨çŹŚăŽäťťćăŽçľăżĺăăă§ăă ĺčż°ăŽăăăŤăCďźăăăăčĄăăăăŤčŚăăćšćłă¨é常ăŤăăäźźăŚăăžăă ăžăăPythonăŽf-stringăžăăŻCďźăšăżă¤ăŤă弽ăżăžăăăĺć§ăŽä˝żç¨ćłă厚ćăŤăă_ANYTHING_ă羜寞ăŤĺăĺ
Ľăăžăă InterPolationACTIVATE"My @$@age###^&%$ is not @$@quality###^&%$ in this discussion"INTERpolationDEACTVATEandNullify
ăŻč¨ąĺŽšăăăžăă ăŠăĄăăăă訹厚ă§ăăă ăăăŚăç§ăŻĺčŤăč¨ăŁăŚăăžăăă ç§ăŻăććĽăĺăăă fmt.Sprintf
ăčś
ăăćĺĺčŁéăŽč¨ă訳ăăăžăă ăĄăłăăăłăšăŽăĄăŞăăă ăă§ăăăăŻćŁĺ˝ĺăăăžăă
ç§ăŻăăăăăŞăăŽçšĺŽăŽăąăźăšăŤĺ˝šçŤă¤ăă¨ăç解ăăŚăăžăă
https://blog.golang.org/go2-here-we-come @griesemerăŻăč¨čŞăĺ¤ć´ăăĺ ´ĺăŻ
ăăăŻĺ¤ăăŽäşşăŤă¨ăŁăŚéčŚăŞĺéĄă§ăăďź
ăăăăžăăăăăăăŞăă¨ćăăžăă ăăăŻăçăćĺĺă§5ă¤äťĽä¸ăŽĺç §ăĺŚçăăĺż čŚăăăŁăă ăăŽäşşăŤă¨ăŁăŚăŻéčŚă§ăŻăŞăćŠč˝ă ă¨ćăăžăă ăžăăŻăäťăŽäťć§čŚäťśăŽăăăŤăă¨ăŤăăăăłăăŹăźăă使ç¨ăăŚĺ¸¸ăŤçŽĄçăăĺż čŚăăăăžăăă ăăăăăăă使ç¨ăăŚăăç§ăăĄăŤă¨ăŁăŚăŻă ĺĺ¨ăăŞăă¨ăăŻăăŞăčŚéăăăžăă ăžăăăŞăăˇă§ăłăăŞăăŁăĺ ´ĺďźGoăŽĺăŤCăC ++ăŞăŠă使ç¨ăăăă¨ăăăĺ ´ĺăŽăżďźăçľé¨ăŽäžăŻăăăŤĺżăăăăăăăžăăŻĺ˝źăăĺéĄçšăĺżăăăă¨ăăŚĺŻžĺŚăăŞăăă°ăŞăăŞăăŁăććŞăŽăăă¸ă§ăŻăă¨ăăŚćăĺşăăžăăă ăťă¨ăăŠăŽGoéçşč ăăĺŽéăŤăăźăŤăŤĺ¤ć°ăŽćĺĺčŁéăăľăăźăăăč¨čŞă使ç¨ăăŚăăŞăéăăăăŽĺéĄăŤé˘ăăŚĺ¤ć°ć´žăŽĺçăĺžăăăă¨ăŻćăăžăăă
ăăăŻă20嚴䝼ä¸ĺăŤăăăŽWebéçşč
ă¨ăăŚĺ§ăăŚäťĽćĽăç§ă常ăŤééăăŚăăĺéĄă§ăă ăăăăŽăťă¨ăăŠăŽĺ ´ĺăăăłăăŹăźăăŻăăăłăă¨ăłăă¨ăăăŻă¨ăłăă§ä¸čŹçă§ăăă ç§ăŽăăŁăŞă˘ăŽăăŽé¨ĺăŽćĺžă§ăç§ăŻćçľçăŤRuby on Railsă§ä˝ćĽăăRubyăŽ"My #{age} is not #{quality} in this discussion"
ćĺĺčŁéăŤăăăŤĺ¤˘ä¸ăŤăŞăăžăăă ăăłă-ä¸-ä¸ćŹĺź§ăŽć§ćăŻăćĺăŻé常ăŤĺĽĺŚă ă¨ćăăžăăăă çľąĺă¨ăłă¸ăă˘ăŞăłă°ăŤç§ťčĄăăă¨ăăç§ăŻä¸ťăŤPython 3ă使ç¨ăăŚăăăĺ¤ăďź
形ĺźăŽćĺĺăŽäťŁăăăŤć°ăăstr.format()
ăˇăšăă ă使ç¨ăăćšăăŻăăăŤĺš¸ăă§ăăă ăăă使ç¨ăăă¨ă "My {} is not {} in this discussion".format(age, quality)
ăŽăăăŞăă¨ăăăžăă ăăăăŁăŚăĺ°ăŞăă¨ăăżă¤ăăŤäžĺăăŞăĺç
§ă使ç¨ăăăă¨ăŻăăŚăźăšăąăźăšăŽ90ďź
ă§ăŻéčŚă§ăŻăăăžăăă§ăăă ăăăŻç解ăăăŽăç°Ąĺă§ăă¤ăłăăăŻăšă ăăŤé˘ĺżăăăăžăă "My {age} is not {quality} in this discussion".format(age=my_age_var, quality=my_quality_var)
ăŽăăăŞĺĺăŽäťăăĺç
§ă ăăă§ăĺăĺ¤ć°ă30ĺĺç
§ăăăĺ ´ĺăăăŠăĄăźăżăźă§1ĺćĺŽăăă ăă§ă追补ăăłăăźďźč˛źăäťăăăžăăŻĺé¤ăç°ĄĺăŤăŞăăžăă ĺĺäťăăăŠăĄăźăżăźďźĺ
Ľĺă¨ăăŚďźăŻăGoă§čŚéăăŚăăPythonăŽăă1ă¤ăŽćŠč˝ă§ăă ăăăăĺż
čŚăŤĺżăăŚç§ăŻăăăŞăă§çăăăă¨ăă§ăăžăă ăăăăç§ăăăăŤçŽăĺăăçŹéăf-stringsďźPython 3.6ă§ĺ°ĺ
ĽăăăďźăŤĺăłćăăăžăăă ćĺĺčŁéăŻĺ¸¸ăŤç§ăŽçć´ťă漽ăŤăăŚăăăžăăă
@runeimpăăăăŽ50䝼ä¸ăŽĺŻĺ¤ćĺĺčŁéăŽ1ă¤ăŽäžăć稿ă§ăăžăăďźä˝żç¨ăăŚăăäťťćăŽč¨čŞă§ďźďź ĺéĄăŽăłăźăăŽĺŽéăŽäžăćăŁăŚăăă¨ăč°čŤăŤĺ˝šçŤă¤ăăăăăŞăă¨ćăăžăă
OKăăăăŻćçľçăŞăłăźăă§ăŻăŞăăĺç´ăŞäžă§ăăăĺç §ăŻ50ĺăăăŞăăĺ¤ć°ĺăŻçĄĺŽăäżčˇăăăăăŤĺ¤ć´ăăăŚăăžăă
func (dt DataType) String() string {
MMMCodeTail := " "
if len(pn.MMMCode) > 0 {
MMMCodeTail = "\n\t"
}
MMMVCTail := " "
if len(pn.MMMVoipCommunication) > 0 {
MMMVCTail = "\n\t"
}
MMMCCTail := " "
if len(pn.MMMCombatConditions) > 0 {
MMMCCTail = "\n\t"
}
MMMSRTail := " "
if len(pn.MMMSecurityReporting) > 0 {
MMMSRTail = "\n\t"
}
MMMLKTail := " "
if len(pn.MMMLanguagesKnown) > 0 {
MMMLKTail = "\n\t"
}
return fmt.Sprintf(`ThingID=%6d, ThingType=%q, PersonID=%d, PersonDisplayName=%q, PersonRoomNumber=%q,
DateOfBirth=%s, Gender=%q, LastViewedBy=%q, LastViewDate=%s,
SaleCodePrior=%q, SpecialCode=%q, Factory=%q,
Giver=%s, Manager=%q, ServiceDate=%s, SessionStart=%s, SessionEnd=%s, SessionDuration=%d,
HumanNature=%q, VRCatalog=%v, AdditionTime=%d, MeteorMagicMuscle=%v,
VRQuest=%q, SelfCare=%v, BypassTutorial=%q, MultipleViewsSameday=%v,
MMMCode=%q,%sMMMVoipCommunication=%q,%sMMMCombatConditions=%q,%sMMMSecurityReporting=%q,%sMMMLanguagesKnown=%q,%sMMMDescription=%q,
SaleCodeLatest=%q, HonoraryCode=%q, LegalCode=%q, CharacterDebuffs=%q,
MentalDebuffs=%q, PhysicalDebuffs=%q,
CharacterChallenges=%q,
CharacterChallengesOther=%q,
CharacterStresses=%q,
RelationshipGoals=%q, RelationshipGoalsOther=%q,
RelationshipLobsters=%q,
RelationshipLobstersOther=%q,
RelationshipLobsterGunslingerDoublePlus=%q,
RelationshipLobsterGunslingerPlus=%q,
RelationshipLobsterGunslingerGains=%q,
PersonAcceptsRecognition=%q,
PersonAcceptsRecognitionGunslinger=%q,
BenefitsFromChocolate=%v, DinnerForLovelyWaterfall=%v, ModDinners=%q, ModDinnersOther=%q,
FlexibleHaystackList=%q, FlexibleHaystackOther=%q,
ModDiscorseSummary=%q,
MentallySignedBy=%q, Overlord=%q, PersonID=%d,
FactoryID=%q, DeliveryDate=%s, ManagerID=%q, ThingReopened=%v`,
dt.ThingID,
dt.ThingType,
dt.PersonID,
dt.PersonDisplayName,
// dt.PersonFirstName,
// dt.PersonLastName,
dt.PersonRoomNumber,
dt.DateOfBirth,
dt.Gender,
dt.LastViewedBy,
dt.LastViewDate,
dt.SaleCodePrior,
dt.SpecialCode,
dt.Factory,
dt.Giver,
dt.Manager,
dt.ServiceDate,
dt.SessionStart,
dt.SessionEnd,
dt.SessionDuration,
dt.HumanNature,
dt.VRCatalog,
dt.AdditionTime,
dt.MeteorMagicMuscle,
dt.VRQuest,
dt.SelfCare,
dt.BypassTutorial,
dt.MultipleViewsSameday,
dt.MMMCode, MMMCodeTail,
dt.MMMVoipCommunication, MMMVCTail,
dt.MMMCombatConditions, MMMCCTail,
dt.MMMSecurityReporting, MMMSRTail,
dt.MMMLanguagesKnown, MMMLKTail,
dt.MMMDescription,
dt.SaleCodeLatest,
dt.HonoraryCode,
dt.LegalCode,
dt.CharacterDebuffs,
dt.MentalDebuffs,
dt.PhysicalDebuffs,
dt.CharacterChallenges,
dt.CharacterChallengesOther,
dt.CharacterStresses,
dt.RelationshipGoals,
dt.RelationshipGoalsOther,
dt.RelationshipLobsters,
dt.RelationshipLobstersOther,
dt.RelationshipLobsterGunslingerDoublePlus,
dt.RelationshipLobsterGunslingerPlus,
dt.RelationshipLobsterGunslingerGains,
dt.PersonAcceptsRecognition,
dt.PersonAcceptsRecognitionGunslinger,
dt.BenefitsFromChocolate,
dt.DinnerForLovelyWaterfall,
dt.ModDinners,
dt.ModDinnersOther,
dt.FlexibleHaystackList,
dt.FlexibleHaystackOther,
dt.ModDiscorseSummary,
dt.MentallySignedBy,
dt.Overlord,
dt.PersonID,
dt.FactoryID,
dt.DeliveryDate,
dt.ManagerID,
dt.ThingReopened,
)
}
func (dt DataType) String() string {
MMMCodeTail := " "
if len(pn.MMMCode) > 0 {
MMMCodeTail = "\n\t"
}
MMMVCTail := " "
if len(pn.MMMVoipCommunication) > 0 {
MMMVCTail = "\n\t"
}
MMMCCTail := " "
if len(pn.MMMCombatConditions) > 0 {
MMMCCTail = "\n\t"
}
MMMSRTail := " "
if len(pn.MMMSecurityReporting) > 0 {
MMMSRTail = "\n\t"
}
MMMLKTail := " "
if len(pn.MMMLanguagesKnown) > 0 {
MMMLKTail = "\n\t"
}
return fmt.Print(F`ThingID={dt.ThingID}, ThingType={dt.ThingType}, PersonID={dt.PersonID}, PersonDisplayName={dt.PersonDisplayName}, PersonRoomNumber={dt.PersonRoomNumber},
DateOfBirth={dt.DateOfBirth}, Gender={dt.Gender}, LastViewedBy={dt.LastViewedBy}, LastViewDate={dt.LastViewDate},
SaleCodePrior={dt.SaleCodePrior}, SpecialCode={dt.SpecialCode}, Factory={dt.Factory},
Giver={dt.Giver}, Manager={dt.Manager}, ServiceDate={dt.ServiceDate}, SessionStart={dt.SessionStart}, SessionEnd={dt.SessionEnd}, SessionDuration={dt.SessionDuration},
HumanNature={dt.HumanNature}, VRCatalog={dt.VRCatalog}, AdditionTime={dt.AdditionTime}, MeteorMagicMuscle={dt.MeteorMagicMuscle},
VRQuest={dt.VRQuest}, SelfCare={dt.SelfCare}, BypassTutorial={dt.BypassTutorial}, MultipleViewsSameday={dt.MultipleViewsSameday},
MMMCode={dt.MMMCode},{MMMCodeTail}MMMVoipCommunication={dt.MMMVoipCommunication},{MMMVCTail}MMMCombatConditions={dt.MMMCombatConditions},{MMMCCTail}MMMSecurityReporting={dt.MMMSecurityReporting},{MMMSRTail}MMMLanguagesKnown={dt.MMMLanguagesKnown},{MMMLKTail}MMMDescription={dt.MMMDescription},
SaleCodeLatest={dt.SaleCodeLatest}, HonoraryCode={dt.HonoraryCode}, LegalCode={dt.LegalCode}, CharacterDebuffs={dt.CharacterDebuffs},
MentalDebuffs={dt.MentalDebuffs}, PhysicalDebuffs={dt.PhysicalDebuffs},
CharacterChallenges={dt.CharacterChallenges},
CharacterChallengesOther={dt.CharacterChallengesOther},
CharacterStresses={dt.CharacterStresses},
RelationshipGoals={dt.RelationshipGoals}, RelationshipGoalsOther={dt.RelationshipGoalsOther},
RelationshipLobsters={dt.RelationshipLobsters},
RelationshipLobstersOther={dt.RelationshipLobstersOther},
RelationshipLobsterGunslingerDoublePlus={dt.RelationshipLobsterGunslingerDoublePlus},
RelationshipLobsterGunslingerPlus={dt.RelationshipLobsterGunslingerPlus},
RelationshipLobsterGunslingerGains={dt.RelationshipLobsterGunslingerGains},
PersonAcceptsRecognition={dt.PersonAcceptsRecognition},
PersonAcceptsRecognitionGunslinger={dt.PersonAcceptsRecognitionGunslinger},
BenefitsFromChocolate={dt.BenefitsFromChocolate}, DinnerForLovelyWaterfall={dt.DinnerForLovelyWaterfall}, ModDinners={dt.ModDinners}, ModDinnersOther={dt.ModDinnersOther},
FlexibleHaystackList={dt.FlexibleHaystackList}, FlexibleHaystackOther={dt.FlexibleHaystackOther},
ModDiscorseSummary={dt.ModDiscorseSummary},
MentallySignedBy={dt.MentallySignedBy}, Overlord={dt.Overlord}, PersonID={dt.PersonID},
FactoryID={dt.FactoryID}, DeliveryDate={dt.DeliveryDate}, ManagerID={dt.ManagerID}, ThingReopened={dt.ThingReopened}`,
)
}
äťĺžć°ĺš´éăćŻćçśćăăăłčż˝ĺ ăć´ć°ăĺé¤ăăăŽăŻ2ă¤ăŽăăĄăŠăĄăă§ăăă
ăŠăĄăăé¸ćă§ăăžăăăďź ăŠăĄăăç§ăŤăŻćăăăăăăŤčŚăăžăă
fmt.Sprintf("%#v", dt)
ă§ă§ăăŞăăăŞăăŽăąăźăšăŻăŠăă§ăăďź ă¤ăžăă注ćăŽčŚäťśăŻä˝ă§ăăďź ćŁç˘şăŞăăŠăźăăăďźäžďźăťăăŹăźăżăźăŽ=
ă¨:
ă %q
ă¨%v
ă...ďźďź ĺ°ĺˇăăăŚăăŞăăăŁăźăŤăďź ćščĄďź
äťăŽăăă°ăŠă ăĺşĺă解ćăăŚăăžăăăăăă¨ăăăăŻäşşéăćśč˛ťăăăăăŽăăŽă§ăăďź
ăŞăăŹăŻăă使ç¨ăăăŽăŻăŠăă§ăăďź
v := reflect.ValueOf(dt)
t := v.Type()
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
s += fmt.Sprintf("%s=%v", f.Name, v.Field(i))
if t.Field(i).Type.Kind() == reflect.String && v.Field(i).Len() > 0 {
s += "\n\t"
} else {
s += " "
}
}
ăăŽé常ăŤĺ ˇä˝çăŞäžă§ăŻăăăăăŽăŞăăˇă§ăłăŻăŠăĄăă匼ĺ˝ă§ăă ăăăăăăăŻăăŁă¨č¤éăŞăă¨ăŤăŻăŞăăžăăă ăžăăŻćĺéăäťăŽăăŽă ĺăĺç §ă1ă¤ăŽćĺĺă§ä˝ĺşŚă使ç¨ăăăĺ ´ĺăŽăăăŤă ăžăăŻăĺ¤ăĺä¸ăŽć§é ä˝ăžăăŻăăăăŽä¸é¨ă§ăŻăŞăăĺăăšăłăźăă§çćăăăžăă ăăăŻĺăŞăäžă§ăă ćŽĺżľăŞăăăĺŽéăŽăłăźăă襨示ăăăă¨ăŻă§ăăžăăă ăăăăĺŽéăŤăŻăä˝çžăăŽĺčŞăĺŤăžăăŚăăWebăăźă¸ăčŚăŚăă ăăă ă˝ăźăšăăĽăźăéăă50䝼ä¸ăŽĺčŞăĺçă§ăăĺż čŚăăăăă¨ăćłĺăăŚăă ăăă ăăăWebăăźă¸ç¨ă§ăŻăŞăăă¨ăćłĺăăŚăżăŚăă ăăăäťăŽççąă§ăăłăăŹăźăăˇăšăă ăŻĺż čŚăăăžăăăăăăŽĺéĄă解湺ăăăăăŤăăăšăŚăŽĺ¤ć°ăăă§ăŤăšăłăźăĺ ăŤăăăăłăźăăŽäťăŽé¨ĺăč¤ć°ăŽĺ ´ćă§ä˝żç¨ăăăŚăăžăăăăŽăłăźăăăăăŻă§ăŻăăăŽăăăšăăŻ3ă4éąéăă¨ăŤĺ¤§ăăăé常ăŤéčŚăŞćšćłă§ĺ¤ć´ăăăĺ ´ĺăăăăžăă ăăăŻăPDFăCSVăSQL INSERTăéťĺăĄăźăŤăAPIĺźăłĺşăăŞăŠăŽä¸é¨ăžăăŻăăšăŚă_ćă _çćăăĺż čŚăăăăˇăšăă ăŽä¸é¨ă§ăăĺŻč˝ć§ăăăăžăă
ĺŽéăŽäžăăŞăăă°ăăăŽććĄăĺéĄăŽćŁăă解湺çă§ăăăăŠăăăĺ¤ćăăăŽăŻé常ăŤĺ°éŁă§ăă ăăăăćĺĺčŁéăćŹĺ˝ăŤč§Łćąşçă§ăăăăăăăăŻXYĺéĄăŤç´é˘ăăŚăăăŽăăăăăžăăă ăăăăăćŁăă解湺çăŻăă§ăŤăŠăăăŽč¨čŞăŤăăăă解湺çăŻăăăąăźă¸ăŞăăŹăŻăă¸ăŽĺ¤ć´ăăžăăŻăăăăăăăąăźă¸ăăăšă/ăăłââăăŹăźăă§ăă
ăžăăăăăĺ¤ăăŽäşşăŤă¨ăŁăŚéčŚăŞĺéĄă§ăăăăŠăăăŻçĺă§ăă ăăăŻç§ăăăăŤă¤ăăŚčŚăŚćăĺşăăă¨ăă§ăăĺŻä¸ăŽçĺŁăŞč°čŤă§ăăăçľľćĺć缨ăŻĺ§ĺçăŞćŻćă示ĺăăŚăăžăăă ăľăźăăăźăăŁăŽăŠă¤ăăŠăŞăćŁç˘şăŤčąĺŻă§ăŻăăăžăăă
揥ăŤăfmt.PrintfďźăăăłăăĄăăŞďźă§ăăçš°ăčżăĺźć°ăĺŽčĄă§ăăăă¨ăććăă䞥ĺ¤ăăăăžăă
fmt.Printf("R%s T%[1]s T%[1]s was a canine movie star\n", "in")
珏ä¸ăŤăäťăŽč¨čŞă§ćĺĺčŁéă使ç¨ăăăă¨ăăăäşşăGoă§ăăăčŚăăă¨ćăă¨ăŻéăăŞăă¨ćăăžăă ç§ăŻäťĽĺăŤăăă¤ăăŽč¨čŞă§ăăă使ç¨ăăžăăăăĺç´ăŞĺ¤ć°ăčŁéăăăĺ ´ĺăŻĺéĄăăăžăăăăăăč¤éăŞĺźăé˘ć°ĺźăłĺşăăă¨ăšăąăźăăăăăăŠă°ćĺăŞăŠă使ç¨ăăŚăăăăăăšăŚăŤăăŠăźăăăăŽčŠłç´°ăčż˝ĺ ăăăă¨ăăă¨ăăăŤďźăăăŻĺż çśçăŤăprintfăăšăżă¤ăŤăŽă˘ăăăźăăćĺłăăžăďźĺ ¨ä˝ăăăăŤčŞăăŞă桡䚹ăŤăŞăĺŻč˝ć§ăăăăžăă
ćĺžăŤăčŁéăăĺ¤ć°ăĺ¤ć°ăăĺ ´ĺăŻă text/template
ăćĺăŽă˘ăăăźăă§ăăă¨ćăăăăăăĺ¤ć°ăăăŽč¤éăăŽä˝ăăč¨čŞčŞä˝ăŤçľąĺăăăŽă§ăŻăŞăăć確ăŤĺŽçžŠăăăć§é ăŽä¸é¨ă§ăŻăăăžăăă
ăžăăŻăDSLăä˝ćăăžăă
func (dt *DataType) String() string {
var s strings.Builder
_ = fields.Format(&s,
fields.PaddedInt("ThingID", 6, dt.ThingID),
fields.String("ThingType", dt.ThingType),
fields.String("PersonID", dt.PersonID),
fields.Time("DateOfBirth", dt.DateOfBirth),
...
)
return s.String()
}
ăžă
func (dt *DataType) String() string {
var s fields.Builder
s.PaddedInt("ThingID", 6, dt.ThingID),
s.String("ThingType", dt.ThingType),
s.String("PersonID", dt.PersonID),
s.Time("DateOfBirth", dt.DateOfBirth),
return s.String()
}
@ianlancetaylorăŽćčŚă桹ăç解ă§ăăžăă ç§ăăĄăŻăă¤ăăŽăăăŤfmt. Printf
ă§çăăăă¨ăă§ăăăă¨ăçĽăŁăŚăăžăă
ĺćăŤă @alanfoăŽćčŚăŤăă䝼ä¸ĺćăăăă¨ăŻă§ăăžăăă§ăăă
čŞăżăăăăĺ¤ć´ăăăăăă¨ăŠăźăçşçăăŤăă
ăăăŻăĺ ç˘ăŞăˇăšăă ăăă°ăŠăăłă°ăŤă¨ăŁăŚé常ăŤéčŚă§ăă
äťăŽč¨čŞăŽćŠč˝ăă˘ă¤ăă˘ăćĄç¨ăăăă¨ăŻăäşşă
ăŽč˛´éăŞćéă大ĺš
ăŤçŻç´ă§ăăăŽă§ăăă°ăăžăŁăăćĽăăšăăă¨ă§ăŻăŞăă¨ćăăžăă ĺŽéăĺ¤ăăŽäşşăćĺĺčŁéăŽĺéĄăŤčŚăăă§ăăžăă
äťăŽçžäťŁč¨čŞăćĺĺčŁéăćĄç¨ăăŚăăăŽăŤăŻççąăăăăžăă
GoăCăăăĺ°ăă ăĺŞăăč¨čŞăŽăžăžă§ăăŁăŚăťăăăŞăă
Gov2ăŻGoăăŻăăăŤĺŞăăŚăăăăŁăłăšă ă¨ćăăžăă
IMHOăćĺĺčŁéćŠč˝ăćäžăăăŚăăĺ ´ĺăç§ăăĄăŽăťă¨ăăŠăŻăăă使ç¨ăăăă¨ăé¸ćăăžăă ćăăăă¨ăă§ăăžăă
psă
ćŽĺżľăŞăăă @runeimpăŽăąăźăšăŻăăžăăŤăă¨ăă¸ăąăźăšă§ăă çśćłăŽçăżăćăăăă¨ăă§ăăžăă ăăăăăăăŻććĄăŽă˘ă¤ăă˘ăćć§ăŤăăžăă ďźéĺăŞăďź
@doorttsăŻćťćăĺăăžăăă ç§ăŻăă¤ăćŁç´ăŞäźčŠąăŤćčŹăăŚăăžăă
ĺŽéăŽăłăźăăć稿ăăă¨ăč°čŤăŤă¸ăăżăçăăĺŻč˝ć§ăăăăă¨ăç§ăŻçĽăŁăŚăăžăăă ăžăă粞çĽçăŤćĄĺźľăăăăăŤĺ°ăăŽĺľé ć§ăĺż čŚă¨ăăčżäźźăć稿ăăăă¨ăŻăăăăăč°čŤă桡䚹ăăăă ăă§ăăăă¨ăçĽăŁăŚăăžăăă ă ăăç§ăŻäťăŽčŞ°ăăăăăăăăă¨ăćĺž ăăŚăăŞăăŽă§ăŽăŁăłăăŤăăăžăăă ăăăăĺŽéăŽăłăźăăĺ ąćăăăă¨ăŻé¸ćč˘ă§ăŻăŞăăĺ ˇä˝çăŞäžă§ăăăç˝éťăŤăăăŽăŤăăăćéă§ăăăăă䝼ĺ¤ăŽĺ ´ĺăŻăžăŁăă使ç¨ăăžăăăăäťăŽă¨ăăç§ăă¨ăăŤăŽăźăćăŁăŚăăăăă§ăŻăăăžăăă ç§ăŻăă§ăŤĺăŤčż°ăšăççąăŽăăăŤăăŽč°čŤăĺ°éŁă§ăăăă¨ăăă§ăŤăăçĽăŁăŚăăžăă ç§ăŻăăăŽćŠč˝ăŽçăŽäžĄĺ¤ăç解ăăŚăă12äşşăŽä¸äşşă§ăŻăŞăăă¨ăçĽăŁăŚăăžăă ăăăăăăăăŽăťă¨ăăŠăŻăăťăźç˘şĺŽăŤăăŽăšăŹăăăŽčżăăŤăŻăăăžăăă Reddită§ăăžăăžăăăŤă¤ăăŚăŽć稿ăčŚăăŽă§ăç§ăŻăăăŤăăă ăă§ăă ăăă§ăŞăăă°ăç§ăŻăăŽăăăťăšăŤăťă¨ăăŠĺŽĺ ¨ăŤć°ăĽăăŚăăžăăă§ăăă äźčŠąăŤéŁăłčžźăĺż čŚć§ăćăăăă¨ăŞăăGoă§çŠäşăăŠăŽăăăŤé˛ăă§ăăăăŤăăŞăćşčśłăăŚăăžăă ăăăăč¨čŞăŽĺ¤ć´ăććĄăăăăăłăŤĺ ćăăć Łć§ăŽéăŽăăăŤăăăăćąăăŚćŚă声ăŻăăăťăŠĺ¤ăăŞăăă¨ăçĽăŁăŚăăăŽă§ăç§ăŻăăŽč°čŤăćäźăăăă¨ćăăžăăă č¨čŞăŽĺ¤ĺăŤĺŻžăăăăăťăŠĺźˇăĺ寞ăŻäťăžă§čŚăăă¨ăăŞăă¨ćăăžăă ăăăŚăăăăŻä˝ăć°ăăăă¨ăćŻćăăŚć稿ăăăă¨ăé常ăŤćăăăăăŽăŤăăžăă ăŠăŽč¨čŞăăŹăăĽăźăŞăă§ăăšăŚăŽć°ćŠč˝ăŽăŞăŻă¨ăšăăĺăĺ Ľăăăšăă ă¨č¨ăŁăŚăăăŽă§ăŻăăăžăăă ăľăăźăĺ´ă§éăăŤčŚăăççąăŻăĺż ăăă揲ćąăăŞăăăă§ăŻăăăžăăă ăăă§ăăăŽćŠč˝ăŤčĺłăŽăăäşşăŻ_something_ăć稿ăăŚăă ăăă ä˝ă§ăăăăă§ăăă¤ăăŽĺŽć°ăčŚăăă¨ăă§ăăžăă
äźćĽăŞăŽă§ä¸čŹçăŤăŻăăžă注çŽăăăŚăăŞăă¨ćăăžăă ćĺĺčŁéăŻăéçşč ăŽčŚłçšăăăŻé常ăŤäžżĺŠă§ćăžăăăăŽă§ăďźăăăăäťăŽĺ¤ăăŽč¨čŞă§ä˝żç¨ăăăŚăăççąă§ăďźăăăăŽććĄăŻăçžćçšă§ăŻăăŽăăăŞĺ¤§ăăŞĺ¤ć´ăŤĺŻžĺżăăŚăăŞăăăă§ăăćĺŚăăăĺ ´ĺăç§ăŻăăăŻćăăžăăăĺ°ćĽăĺć¤č¨ăă䞥ĺ¤ăăŞăăă¨ăćĺłăăžăă ăăăćăăăŤăăĺ°ăăŞĺ˘ĺĺ¤ć´ăŻăžă ĺŽć˝ăăăŚăăžăăă
ăšăłăźăăăĺĺă§ĺ¤ć°ăĺçăŤč§Łćąşăăăă¨ăŻăçžĺ¨ĺŻč˝ă ă¨ç§ăćăăă¨ă§ăŻăăăžăăďźyaegi EvalăŻăăăčĄăăăă§ăăďźďźă
@runeimpăĺç
§ăăŚăăć稿ăŻr/golangăŽç§ăŽć稿ă ă¨ćăăžăhttps://www.reddit.com/r/golang/comments/d1199a/why_is_there_no_equivalent_to_f_strings_in_python/
ăăĺ°ăč°čŤăăăă¨ăăă
ç§ăŻăă 帽ĺăăăśăŁăŚăĺŻĺ¤čŁéăç§ăŤă¨ăŁăŚé常ăŤĺ˝šçŤă¤ă ăăă¨č¨ăăăăŁăăŽă§ăăPythonăŽä¸çăăćĽăfmt.sprintfăŽăăăŞăăŽăŻăGoăă˛ăŠăä¸ć źĺĽ˝ă§čŞăż/çśćăăăŽăćăăăăăăŤčŚăăžăă
GoăŻăé常ăŤç°Ąĺă§ĺźˇĺăŞăă¨ăčĄăćšćłăŤăăăŚăăťă¨ăăŠăŽĺ ´ĺé常ăŤă¨ăŹăŹăłăă§ăă čŞăżăăăă¨äżĺŽć§ăŻăăŽĺ˛ĺŚăŽä¸ć ¸ă¨ăŞăăăăłăăŽä¸é¨ă§ăăăćĺĺăčŞăă§ä˝ăĺ ĽăŁăŚăăăŽăăçĽăăă¨ăŻăăăťăŠéŁăăăă¨ă§ăŻăăăžăăă ăŠăŽĺ¤ć°ăăăŽćĺĺăŽćĺžăŤăăăŞăšăĺ ăŽăŠăŽé çŽăŤăăăăăăŚăăăăĺżľé ăŤç˝ŽăăŞăăăä˝ăĺşĺăăăăăç解ăăăă¨ă§ăé常ăŤéčŚăŞăŞăźăăźăăăăçşçăăžăă ăăŽç˛žçĽçăŞăŞăźăăźăăăăçśćăăĺż čŚăŻăăăžăăă
fmt.sprintfăéŠĺă§ăăă¨ćăăăĺ ´ĺăŻăăăă使ç¨ă§ăăžăă ććĄăçžĺ¨ăŽćšćłăăăééăăŞăčŞăżăăăăç´ćçă§ăäżĺŽă厚ćă§ăăăăă严ćšăč¨čŞă¨ăăŚăŽGoăćăŞăă¨ăŻćăăžăăă ăăăŻă50䝼ä¸ăŽĺ¤ć°ăŽčŁéăŤăăŁăŚćŁĺ˝ĺăăăĺż čŚăŻăăăžăăăăăăŻă1ă¤ăŽĺ¤ć°ă ăăŽčŁéăŤăăćšĺă§ăă
ăŽăăăŞăăŽă§ă
fmt.sprintf("I am %<type name here>{age} years old.")
# or
fmt.sprintf("I am %T{age} years old")
č¨čŞăŤćŹĺ˝ăŤć厳ăŞčŚéăďź ééăŁăŚăăăă¨ă訟ćăăăŚăăăăă§ăăăćŁç´ăŞă¨ăăăăăŽďźăžăăŻăăŽăăăŞďźććĄă§ăŻăéćšĺăŽéäşćć§ăé¤ăăŚăéăăžăŤăăčŚăăžăăăăăăŻăGoăŽć°ăăăĄă¸ăŁăźăăźă¸ă§ăłă§ăăăĺŽčŁ ăăăăăŞăăŽăçăŤăăŞăŁăŚăăĺ ´ĺă§ăă
ăŤăăăŞăăććĄăăăă¨ăăăłăăĽăăăŁăŽăăŞăăŽé¨ĺăćčŹçĽăăŻăŞăšăăšăć°ĺš´ăŽăăăŤäźćăă¨ăŁăŚăăăŽă§ăăăŽč°čŤăăă1ăťăă4éąééăăăžăžăŤăăŚăăăă¨ăć¤č¨ă§ăăžăăďź
https://github.com/golang/go/issues/34174#issuecomment -558844640䝼éăăăăŤĺ¤ăăŽč°čŤăčĄăăăŚăăăăăăăăfinal-comment-periodăăćťăăžăă
ăăă§čŞŹĺžĺăŽăăäžăăžă čŚăŚăăŞăă¨ăă@randall77ăŤĺćăăĺžĺăăăăžăă @runeimp ăăľăłăăŤăłăźăăć稿ăăŚăăă ăăăăă¨ăăăăăžăăăčŞăżăŤăăăăŠăĄăăŽćšćłă§ăĺ¤ć´ăăăŽăŻéŁăăăăă§ăă @egonelbreă示ĺăăŚăăăăăŤăăăăăăäżĺŽăăăăăăăĺ ´ĺăćĺăŽăšăăăăŻăžăŁăăç°ăŞăă˘ăăăźăăčŚă¤ăăăă¨ăŽăăă§ăă
@cyclingwithelephants fmt.sprintf("I am %T{age} years old")
ăŻăăăŽăăźăăŤăŤăŻăăăžăăă ăăŽč¨čŞăŻă fmt.Sprintf
ăage
ă解湺ăăăăăŤä˝żç¨ă§ăăăĄăŤăăşă ăćäžăăŚăăžăăă GoăŻăłăłăă¤ăŤăăăč¨čŞă§ăăăăăźăŤăŤĺ¤ć°ĺăŻĺŽčĄćăŤä˝żç¨ă§ăăžăăă ăăăăä¸č¨ăŽ@bradfitzăŽććĄăŤć˛żăŁăŚăăăŽćŠč˝ăĺŽçžăăćšćłăčŚă¤ăăăăă°ăăăăŻăăĺŁăŤĺăă§ăăăă
ćçľăłăĄăłăćéăŽăŠăăŤă解é¤ăăŚăăă ăăăăăă¨ăăăăăžă@ianlancetaylor ă đ
@bradfitzăŽă˘ă¤ăă˘ăŻç´ ć´ăăăăŁăă¨ćăăžăă ăăźăŤăŤĺ¤ć°ăŽăłăłăăăšăăăŞăăŚăăć˝ĺ¨çăŞĺśéăăăă¨ćăăžăăăćĺĺčŁéăăŞăĺ ´ĺăŻăăăăăŽĺśéăĺăă§ĺăĺ
Ľăăžăă ç§ăŻGoăŽăăźăťăłăăźă¸ăăŠăźăăăăŽć´ć°ăŤćŹćă襨ăăŚăăžăăďź %q
ă %v
ăăăăł%#v
ăŽčż˝ĺ ă大弽ăă§ăďźăăăŽăăŠăă¤ă ăŻĺ¤ăăăăăăžăă çąçˇăăăăă¨ăăŁăŚăăăăćĺăŽćšćłă§ăăă¨ăŻéăăžăăă GoăŽăłăłăă¤ăŤĺŚçćšćłă¨ĺăăăăŤăçšăŤăŻăăšăłăłăă¤ăŤăŻăCăžăăŻC++ă§ĺŽčĄăăćšćłăăă_WAY_ĺŞăăŚăăžăă ăăŚăGoăŻăăšăŚăŽĺäťăŞăłăłăă¤ăŠăŞăăˇă§ăłăéŠĺăŞăăăŠăŤăă§é襨示ăŤăăžăăďźăăăŻĺăăăăŤéăĺ
é¨ă§ăă ĺ
ˇä˝çăŤăŻăăăăžăăăăăăă ă¨ćăăžăă ăăăŚăăăăŻĺéĄăăăžăăă ăăăŻç§ăŤăŻĺŽĺ
¨ăŤĺăĺ
Ľăăăăžăă ćŠč˝ăćŠč˝ăăăăăăŤăłăłăă¤ăŠăăŠăŽăăăŞćăĺĺźăčĄăăăŻć°ăŤăăžăăă ăăŽćŠč˝ăçć´ťă漽ăŤăăŚăăăăă¨ăç§ăŻçĽăŁăŚăăžăă ăăăŚăăăăăľăăźăăăç§ă使ç¨ăăăăšăŚăŽč¨čŞăŽéçşč
ă¨ăăŚăŽç§ăŽçć´ťă漽ăŤăăŚăăăžăăă ăăăŚăăăăăľăăźăăăŚăăŞăč¨čŞă§ăŻĺ¸¸ăŤčŚçă§ăă ĺż
čŚăŞćĺĺăăŠăźăăăăŽ98ďź
ăŤĺŻžăăŚăăăźăťăłăăăŠăźăăăă§30䝼ä¸ăŽçšćŽćĺă使ç¨ăăćšćłăăăčŚăăăăă§ăă ăžăăăćŁăăăăźăťăłăăźă¸ĺ˝˘ĺźăăŽäťŁăăăŤ%v
ă使ç¨ăăă¨č¨ăŁăŚăăä˝ćăŽä˝żăăăăăŻĺăă§ăŻăŞăăăĄăłăăăłăšăŽăăăăăĺăă§ăŻăăăžăăă
ăăĺ°ăćéăăăăžăăŽă§ăäžăćăăŚăäşşéă¨ăŽă¤ăłăżăźăă§ăźăšăćąăç§ăăĄăŽä˝ćĽĺšçăŤĺŻžăăéčŚăŞĺŠçšă誏ćăăăŽăŤĺ˝šçŤă¤ăăăăžă§ăăăĺ°ăĺçşçăŞč¨äşăčŚă¤ăăăă¨ăă§ăăăăŠăăă確čŞăăžăă ăăăăĽăĄăłăă¨ăłăźăăŽçćăăăăłĺŽćçăŞćĺĺćä˝ă
ăăăŻăä˝ăăĺŽčŁ ă§ăăăăăŤăŞăăăăăăŞăčăă§ăă ăăčăăăŠăăăŻăăăăžăăăă
ć°ăăćĺĺĺm"str"
ăčż˝ĺ ăăžăďźăăăăçăŽćĺĺă¨ĺăă§ăďźă ăăŽć°ăă税éĄăŽćĺĺăŞăăŠăŤăŻă map[string]interface{}
ă¨čŠäžĄăăăžăă ăăăă§çŠşăŽćĺĺăć¤ç´˘ăăă¨ăćĺĺăŞăăŠăŤčŞä˝ă襨示ăăăžăă ćĺĺăŞăăŠăŤăŤăŻăä¸ćŹĺź§ă§ĺ˛ăžăăĺźăĺŤăăăă¨ăă§ăăžăă ä¸ćŹĺź§ĺ
ăŽĺźăŻăćĺĺăŞăăŠăŤăŤĺŤăžăăŚăăŞăăăŽăăăŤčŠäžĄăăăĺ¤ăŻä¸ćŹĺź§ĺ
ăŤčĄ¨ç¤şăăăăľăćĺĺă§ăăăăźă¨ă¨ăăŤăăăăŤć źç´ăăăžăă
äžăă°ďź
i := 1
m := m"twice i is {i * 2}"
fmt.Println(m[""])
fmt.Println(m["i * 2"])
ăăăŻĺ°ĺˇăăăžă
twice i is {i * 2}
2
ćĺĺăŞăăŠăŤĺ ă§ăŻăä¸ćŹĺź§ăăăăŻăšăŠăăˇăĽă§ă¨ăšăąăźăăăŚăĺç´ăŞä¸ćŹĺź§ă示ăăă¨ăă§ăăžăă ĺźç¨çŹŚă§ĺ˛ăžăăŚăăŞăăä¸č´ăăŞăä¸ćŹĺź§ăŻăăłăłăă¤ăŤă¨ăŠăźă§ăă ä¸ćŹĺź§ĺ ăŽĺźăăłăłăă¤ăŤă§ăăŞăĺ ´ĺăăăłăłăă¤ăŤă¨ăŠăźă§ăă ĺźăŻćŁç˘şăŤ1ă¤ăŽĺ¤ăŤčŠäžĄăăăĺż čŚăăăăžăăăăă䝼ĺ¤ăŽĺ ´ĺăŻĺśéăăăžăăă ĺăăăŹăźăšćĺĺăćĺĺăŞăăŠăŤăŤč¤ć°ĺ襨示ăăăĺ ´ĺăăăăžăă 襨示ăăăĺć°ă ăčŠäžĄăăăžăăăčŠäžĄăŽ1ă¤ă ăăăăăăŤäżĺăăăžăďźăăšăŚĺăăăźăćă¤ăăďźă ćŁç˘şăŤăŠăĄăăć źç´ăăăăăŻćĺŽăăăŚăăžăăďźăăăŻăĺźăé˘ć°ĺźăłĺşăăŽĺ ´ĺăŤéčŚă§ăďźă
ăăŽăĄăŤăăşă čŞä˝ăŻçŹçšă§ăăă彚ăŤçŤăăŞăăăŽă§ăă ăăŽĺŠçšăŻăć確ăŤćĺŽă§ăăăăăăč¨čŞăŤé庌ăŽčż˝ĺ ăĺż čŚă¨ăăŞăăă¨ă§ăă
使ç¨ăŤăŻčż˝ĺ ćŠč˝ăäťĺąăăŚăăžăă ć°ăăé˘ć°fmt.Printfm
ăŻfmt.Printf
ă¨ăžăŁăăĺăăăăŤćŠč˝ăăžăăăćĺăŽĺźć°ăŻstring
ă§ăŻăŞăă map[string]interface{}
ăŞăăžăă ăăăăŽ""
ĺ¤ăŻăăăŠăźăăăćĺĺăŤăŞăăžăă ăăŠăźăăăćĺĺăŻăé常ăŽ%
ăŤĺ ăăŚăć°ăă{str}
俎飞ĺăăľăăźăăăžăă ăăŽäżŽéŁžĺă使ç¨ăăă¨ăĺ¤ăŽĺźć°ă使ç¨ăă䝣ăăăŤă str
ăăăăă§ć¤ç´˘ăăăăăŽĺ¤ă使ç¨ăăăžăă
äžăă°ďź
hi := "hi"
fmt.Printfm(m"%20{hi}s")
20ĺăŽăšăăźăšăŤć¸Ąăăăćĺĺhi
ăĺşĺăăžăă
ĺ˝çśăăăĺç´ăŞfmt.Printm
ăăăă fmt.Print
ăŤăăŁăŚĺşĺăăăăĺŤăžăăŚăăĺ¤ăĺăăŹăźăšĺźăŽäťŁăăăŤä˝żç¨ăăžăă
äžăă°ďź
i, j := 1, 2
fmt.Printm(m"i: {i}; j: {j}")
ĺ°ĺˇăăžă
i: 1; j: 2
ăăŽă˘ăăăźăăŽĺéĄçšďźćĺĺăŞăăŠăŤăŽĺăŤm
ăăŹăăŁăăŻăšă使ç¨ăăă¨ăăĺĽĺŚăŞăă¨ă é常ăŽä˝żç¨ă§č¤čŁ˝ăăăm
-ćŹĺź§ăŽĺĺžăŤ1ă¤ăă¤ă mćĺĺăćĺž
ăăé˘ć°ă¨ä¸çˇăŤä˝żç¨ăăŞăĺ ´ĺăŽmćĺĺăŽä¸čŹçăŞçĄç¨ă
ĺŠçšďźćĺŽăăăŽăŻăăăťăŠéŁăăăăăžăăă ĺç´ăŞčŁéă¨ăăŠăźăăăăăăčŁéăŽä¸Ąćšăăľăăźăăăžăă fmté˘ć°ăŤéĺŽăăăŞăăăăăăłăăŹăźăăžăăŻäşćăăŞă使ç¨ă§ćŠč˝ăăĺŻč˝ć§ăăăăžăă
ĺäťăăăăďźruntime.StringMapăŞăŠďźăŽĺ ´ĺăéĺăéĺăăŽPrintfmăčż˝ĺ ăăăŤfmt.Printă¨Printlnă使ç¨ă§ăăžăă
ĺŽçžŠăăăĺă使ç¨ăăăă¨ăŻčŻăčăă§ăăă fmt.Printfm
ăŤăŻĺ˝šçŤăĄăžăăă ĺŽçžŠăăăĺăfmt.Printf
ăŽćĺăŽĺźć°ă¨ăăŚä˝żç¨ăăăă¨ăŻă§ăăžăăă§ăăăăăăŻă string
ăăĺż
čŚă¨ăăŞăăăă§ăă
@runeimpăŤăăŁăŚăšăŹăăă§äťĽĺăŤč¨ĺăăăăăĺŽĺ
¨ăŤăŻč°čŤăăăŚăăŞăăă¨ăŽ1ă¤ăŻă os.Expand
ă§ăďź-
package main
import (
"fmt"
"os"
)
func main() {
name := "foo"
days := 12.312
type m = map[string]string
f := func(ph string) string {
return m{"name": name, "days": fmt.Sprintf("%2.1f", days)}[ph]
}
fmt.Println(os.Expand("The gopher ${name} is ${days} days old.", f))
// The gopher foo is 12.3 days old.
}
ăăăŻĺç´ăŞăąăźăšăŤăŻĺéˇăăăžăăăčŁéăăĺ¤ăŽć°ăĺ¤ăĺ ´ĺăŻăŻăăăŤĺŁĺ˝ăăăčŻăăŞăăžăďźăă ăăăŠăŽă˘ăăăźăă§ă70ăŽĺ¤ăŤĺéĄăăăăžăďźďźă ĺŠçšăŻćŹĄăŽă¨ăăă§ăďź-
ăăăăłă°é˘ć°ăŤăŻăăźă¸ăŁă使ç¨ăăă¨ăăăźăŤăŤĺ¤ć°ăéŠĺăŤĺŚçă§ăăžăă
ăžăăäťťćăŽăăŠăźăăăăéŠĺăŤĺŚçăăčŁéăăăćĺĺčŞä˝ăăăăăćé¤ăăžăă
ăăăăłă°é˘ć°ăŤĺĺ¨ăăŞăčŁéćĺĺă§ăăŹăźăšăăŤăăźă使ç¨ăăă¨ăčŞĺçăŤçŠşăŽćĺĺăŤç˝Žăćăăăăžăă
ăăăăłă°ćŠč˝ăŽĺ¤ć´ăŻćŻčźçç°Ąĺă§ăă
ç§ăăĄăŻăă§ăŤăăăćăŁăŚăăžă-č¨čŞăăŠă¤ăăŠăŞăŽĺ¤ć´ăŻĺż čŚăăăžăăă
@ianlancetaylorăăŽč§ŁćąşçăŻç§ăŤăŻç˘şăăŞé¸ćč˘ăŽăăăŤčăăăžăă ăŞăĺĽăŽPrintăĄă˝ăăăĺż
čŚăŞăŽăăăăăžăăăă ç§ăŻä˝ăăčŚč˝ă¨ăăŚăăĺŻč˝ć§ăăăăžăăă interface{}
ă¨ăżă¤ăăă§ăăŻă使ç¨ăăĺç´ăŞç˝˛ĺăŽĺ¤ć´ăŽăăă§ăă OKă署ĺăŽĺ¤ć´ăć˘ĺăŽăłăźăăŤă¨ăŁăŚé常ăŤĺéĄăŤăŞăĺŻč˝ć§ăăăăă¨ăŤć°ăĽăăžăăă ăă ăăĺşćŹçăŞăĄăŤăăşă ăĺŽčŁ
ăăăŚăăŚă$ string
ăžăăŻm"str"
ă襨ă$ stringlit
ăżă¤ăăä˝ćăăĺ ´ĺăăžăăŻm"str"
ăstring
ăĺăĺ
Ľăăĺ ´ĺ
@alanfoăĺăłĺăä¸ăăŚăăăŚăăăă¨ăăăăăăŻăăšăŚç´ ć´ăăăçšă§ăă đ
ç§ăŻăŠă¤ăăăłăăŹăźăăŤos.Expand
ă使ç¨ăăžăăăăă¨ăŤăăĺ¤ăŽăăăăä˝ćăăĺż
čŚăăăçśćłă§ăŻé常ăŤäžżĺŠă§ăă ăă ăăăăăăä¸čŚă§ăďźçžĺ¨ăŻä˝ĺşŚăăłăăźăăăŚăăďźç˝Žćé˘ć°ăŽăăźăŤăŤĺ¤ć°ăăăŁăăăŁăăăăă ăăŤăăăă¤ăăŽç°ăŞăé ĺă§ăŻăăźă¸ăŁăä˝ćăăĺż
čŚăăăĺ ´ĺă罎ćé˘ć°ăŻDRYăĺŽĺ
¨ăŤçĄčŚăăăĄăłăăăłăšăŽĺéĄăĺźă辡ăăăčż˝ĺ ăăă ăă§ăăăăĺ¤ăăŽä˝ćĽăčŁéăăăćĺĺăŻăćŁăăćŠč˝ăăăăăăăŽăĄăłăăăłăšăŽĺéĄăčť˝ć¸ăăăăŽĺçăŞćĺĺă玥çăăăăă ăăŤăăăăä˝ćăăĺż
čŚăŻăăăžăăă
@runeimp fmt.Printf
ăŽç˝˛ĺăĺ¤ć´ăăăă¨ăŻă§ăăžăăă ăăăŻGo1ăŽäşćć§ăĺŁăăžăă
stringlit
ĺăŽćŚĺżľăŻăGoăŽĺăˇăšăă ăĺ¤ć´ăăăă¨ăćĺłăăžăăăăăŻăŻăăăŤĺ¤§ăăŞĺéĄă§ăă GoăŻćĺłçăŤé常ăŤăˇăłăăŤăŞĺăˇăšăă ăćĄç¨ăăŚăăžăă ăăŽćŠč˝ăŽăăăŤăăăč¤éăŤăăăă¨ăŻćăăŞăă ăăăŚăăă¨ăăăăăă¨ăăŚăă fmt.Printf
ăŻstring
ĺźć°ăĺăăă¨ăŤăŞăăć˘ĺăŽăăă°ăŠă ăĺŁăăăŤăăăĺ¤ć´ăăăă¨ăŻă§ăăžăăă
@ianlancetaylor誏ćăăŚăăăŚăăăă¨ăă fmt
ăăăąăźă¸ăĺăˇăšăă ăŽăăăŞĺşćŹçăŞăăŽă¨ăŽä¸ä˝äşćć§ăĺŁăăăăŞăă¨ăăéĄćăŤćčŹăăžăă ăŠăăăăăăăăăăŽçˇăŤć˛żăŁăăŞăăˇă§ăłă§ăăăăăăăŞăăăă¤ăăŽé ăăăďźç§ăŤă¨ăŁăŚďźĺŻč˝ć§ăăăăăăăăŞăăă¨ăç§ăŻăă ćăă§ăăžăăă đź
ç§ăŻăăăĺŽčŁ
ăăIanăŽćšćłăćŹĺ˝ăŤĺĽ˝ăă§ăă ă¸ă§ăăŞăăŻăŻfmt.Print
ăŽĺéĄăŤĺ˝šçŤăĄăžăăăďź
contract printable(T) {
T string, map[string]string // or the type Brad suggested "runtime.StringMap"
}
// And then change the signature of fmt.Print to:
func Print(type T printable) (str T) error {
// ...
}
ăăŽăăăŤăăŚăGo1ăŽäşćć§ăçśćăăĺż čŚăăăăžăă
Go 1ă¨ăŽäşćć§ăŽăăăŤăé˘ć°ăŽăżă¤ăăĺ¤ć´ăăăă¨ăŻă§ăăžăăă é˘ć°ăŻĺźăłĺşăăăă ăă§ăŻăăăžăăă ăăăăŻćŹĄăŽăăăŞăłăźăă§ă使ç¨ăăăžă
var print func(...interface{}) = fmt.Print
é˘ć°ăŽăăźăăŤăä˝ćăăă¨ăăăžăăŻăăšăăŤćĺăŽäžĺć§ćł¨ĺ Ľă使ç¨ăăă¨ăăŤăäşşă ăŻăăŽăăăŞăłăźăăč¨čż°ăăžăă
ç§ăŻstrings.Replacerďźhttps://golang.org/pkg/strings/#ReplacerďźăćĺĺčŁéăăťăźĺŽčĄă§ăăă¨ćăăŚăăžăăăčŁéčĺĽĺďź$ {...}ăŞăŠďźă¨ăăżăźăłĺŚçďźăă¨ăă°var i int = 2
ăŽĺ ´ĺăă$ {i + 1}ăăŻăŞăăŹăźăšăĄăłăăŽă3ăăŤăăăăăĺż
čŚăăăăžăďź
ăăăŤĺĽăŽă˘ăăăźăăŤăŻăfmt.Sprintfďź "I am aďź sďź d"ăfooăăăźďźă ĺ°ăŞăă¨ăăăăăŻĺŽĺ ¨ăŤä¸ä˝äşćć§ăăăăžăăFWIWă
č¨čŞč¨č¨ăŽčŚłçšăăăŻăçľăżčžźăżé˘ć°ăć¨ćşăŠă¤ăăŠăŞĺ
ăŽé˘ć°ă¸ăŽĺç
§ăŤćĄĺźľăăăŽăŻçŹçšă§ăă č¨čŞăŽăăšăŚăŽĺŽčŁ
ăŤć確ăŞĺŽçžŠăćäžăăăŤăŻăč¨čŞäťć§ă§fmt.Sprintf
ăŽĺä˝ăĺŽĺ
¨ăŤĺŽçžŠăăĺż
čŚăăăăžăă éżăăăă¨ćăăžăă
ăăăŻăăăăăżăăŞă嚸ăăŤăăăăă§ăŻăăăžăăăă䝼ä¸ăćăä¸čŹçă ă¨ćăăžăă ăăăŻ3ă¤ăŽé¨ĺăŤĺăăăŚăăžă
map[string]interface{}
ăĺăĺăfmt.Printmé˘ć°map[string]interface{}
ăăăăăă§ăăžă"name": name,
ăžăăŻ"qual.name": qual.name,
ăŽççĽĺ˝˘ă¨ăăŚăăăăăŞăăŠăŤă§ăăźăŞăăŽĺĺă訹ĺŻăăžăä¸çˇăŤĺăăăŚăăăăŻćŹĄăŽăăăŞăăŽăĺŻč˝ăŤăăă§ăăă
fmt.Printm("i: {i}; j: {j}", {i, j})
// which is equivalent to
fmt.Printm("i: {i}; j: {j}", map[string]interface{}{
"i": i,
"j": j,
})
ăăă§ăăăŠăźăăăćĺĺă¨ĺźć°ăŽéăŤéč¤ăăăăžăăăăăźă¸ä¸ă§ăŻăăăŤčť˝ăăç°ĄĺăŤčŞĺĺă§ăăăăżăźăłă§ăăă¨ăăŁăżăžăăŻăăźăŤăŻăćĺĺă¨ăłăłăă¤ăŠăŤĺşăĽăăŚ{i, j}
ăčŞĺçăŤĺ
Ľĺă§ăăžăăăăăçŻĺ˛ĺ
ăŤăŞăăăŠăăăéçĽăăžăă
ăăă§ăŻăăăŠăźăăăćĺĺĺ ă§č¨çŽăčĄăăă¨ăŻă§ăăžăăăăăăŻç´ ć´ăăăăă¨ă§ăăăăăăăăźăăšă¨čŚăŞăăŽăŤĺĺăŞĺć°ăăéăăŚăăăŽăčŚăŚăăžăăă
ä¸čŹăŤăăăăŞăăŠăŤăŤéŠç¨ăăăăăăäťăŽĺ ´ĺăŤă使ç¨ă§ăăžăă ä˝ćăăŚăăăăăăŤăăăăźăŤăĄăŞăă§ĺ¤ć°ăŤĺĺăäťăăăă¨ăăăăăăžăă
ăăăŽćŹ çšăŻăć§é ä˝ăŽăăźă解é¤ăăăĺŻč˝ć§ăăăăăăć§é ä˝ăŤéŠç¨ă§ăăŞăăă¨ă§ăă ăăăŻă {:i, :j}
ăŽăăăŞĺĺăŽĺăŤ:
ăčŚćąăăăă¨ă§äżŽćŁă§ăăžăăăăăăă°ă揥ăŽăă¨ăă§ăăžăă
Field2 := f()
return aStruct{
Field1: 2,
:Field2,
}
ăăăŤăŻč¨čŞăľăăźăăĺż čŚă§ăăďź çžĺ¨ăŽăăăŤăăăăăżă¤ăăžăăŻćľĺçă§ăăăżă¤ăăťăźăăŞAPIăŽăăăăă使ç¨ăăă¨ă揥ăŽăăăŤăŞăăžăă
package main
import (
"fmt"
"strings"
)
type V map[string]interface{}
func Printm(format string, args V) {
for k, v := range args {
format = strings.ReplaceAll(format, fmt.Sprintf("{%s}", k), fmt.Sprintf("%v", v))
}
fmt.Print(format)
}
type Buf struct {
sb strings.Builder
}
func Fmt(msg string) *Buf {
res := Buf{}
res.sb.WriteString(msg)
return &res
}
func (b *Buf) I(val int) *Buf {
b.sb.WriteString(fmt.Sprintf("%v", val))
return b
}
func (b *Buf) F(val float64) *Buf {
b.sb.WriteString(fmt.Sprintf("%v", val))
return b
}
func (b *Buf) S(val string) *Buf {
b.sb.WriteString(fmt.Sprintf("%v", val))
return b
}
func (b *Buf) Print() {
fmt.Print(b.sb.String())
}
func main() {
Printm("Hello {k} {i}\n", V{"k": 22.5, "i": "world"})
Fmt("Hello ").F(22.5).S(" world").Print()
}
https://play.golang.org/p/v9mg5_Wf-qD
ăžă éĺšççă§ăăăăăăăľăăźăăăăăăąăźă¸ăä˝ćăăăŽăŻăăăťăŠćéăăăăăŞăăăă§ăă ăăźăăšă¨ăăŚăčŁéăăăç¨ĺşŚăˇăăĽăŹăźăăăă¨č¨ăăăĺŻč˝ć§ăŽăăĺĽăŽćľĺçăŞAPIăĺŤăăžăăă
@ianlancetaylorăăăŽăăăăćĺĺăăŽććĄďźç§ăŻĺäşşçăŤăŻăĺ¤/ĺ¤ć°ćĺĺăă¨avă...ăć§ćă弽ăżăžăăďźăăăŠăźăăă䝼ĺ¤ăŽăŚăźăšăąăźăšă訹ĺŻăăžăă ăă¨ăă°ăďź27605ďźćźçŽĺăŽăŞăźăăźăăźăé˘ć°ďźăŻä¸ťăŤĺĺ¨ăăžăăăăăŻăäťćĽă math/big
ăăăŽäťăŽć°ĺ¤ăŠă¤ăăŠăŞç¨ăŽčŞăżĺăĺŻč˝ăŞAPIăä˝ćăăăă¨ăéŁăăăăă§ăă ăăŽććĄăŻćŠč˝ăĺŻč˝ăŤăăă§ăăă
func MakeInt(expression map[string]interface{}) Int {...}
使ç¨ăăăžă
a := 5
b := big.MakeInt(m"100000")
c := big.MakeInt(m"{a} * ({b}^2)")
éčŚăŞăă¨ăŤăăăŽăăŤăăźé˘ć°ăŻăçžĺ¨ĺĺ¨ăăăăăăăŠăźăăłăšăéŤă埡ĺăŞAPIă¨ĺ ąĺă§ăăžăă
ăăŽă˘ăăăźăăŤăăăăŠă¤ăăŠăŞăŻĺ¤§ăăŞĺźăŤĺŻžăăŚĺż čŚăŞćéŠĺăĺŽčĄă§ăăžăăăžăăĺ¤ăGoĺ¤ć°ă¨ăăŚčĄ¨çžăăŞăăăŤăšăżă ĺźăŽč§ŁćăĺŻč˝ăŤăŞăăăăäťăŽDSLăŤă彚çŤă¤ăăżăźăłăŤăŞăĺŻč˝ć§ăăăăžăă çšăŤăăăăăŽăŚăźăšăąăźăšăŻăĺ˛ăžăăĺ¤ăŽč§Łéăč¨čŞčŞä˝ăŤăăŁăŚčŞ˛ăăăăăăPythonăŽfćĺĺă§ăŻăľăăźăăăăŚăăžăăă
@HALtheWiseăăăă¨ăăăăăŻăăŞăăăĄăă¨ăăŚăăžăă
ä¸čŹçăŞéçşč ăŽçŤĺ ´ăăăăăŽććĄăŤĺŻžăăĺ°ăăŽćŻćă示ăăăăŤăłăĄăłăăăăă¨ćăăžăă ç§ăŻăăă¨ăăŚ3嚴䝼ä¸golangă§ăłăźăăŁăłă°ăăŚăăžăăă ďźobj-c / swiftăăďźgolangăŤç§ťĺăăă¨ăăćĺĺčŁéăĺŤăžăăŚăăŞăăă¨ăŤĺ¤ąćăăžăăă ç§ăŻéĺť10嚴䝼ä¸Că¨C++ă使ç¨ăăŚăăăŽă§ăprintfăŻĺ°ăĺžéăăăă¨ăăć°ćăĄăé¤ăă°ăçšăŤčŞżć´ăăĺż čŚăŻăăăžăăăăłăźăăŽäżĺŽă¨čŞăżăăăăŤăŻç˘şăăŤéăăăăăă¨ăăăăăžăăăăăč¤éăŞćĺĺăŽĺ ´ĺă ç§ăŻćčżďźgradleăăŤăăˇăšăă ç¨ăŤďźĺ°ăkotlinăĺŽčĄăăžăăăăćĺĺčŁéă使ç¨ăăăă¨ăŻć°éŽŽăŞçŠşć°ăŽćŻĺšă§ăăă
ćĺĺčŁéăŻăč¨čŞăŤä¸ć ŁăăŞäşşăŤă¨ăŁăŚćĺĺć§ćăăă茪ăăżăăăăăăă¨ăă§ăăă¨ćăăžăă ăžăăăłăźăăŽčŞăżĺăă¨ć¸ăčžźăżăŽä¸Ąćšă§čŞçĽçč˛ čˇăčť˝ć¸ăăăăăăćčĄçăŞUXă¨ăĄăłăăăłăšăŤăăĄăŞăăăăăăžăă
ăăŽććĄăçăŤć¤č¨ăăăŚăăăă¨ăăăăăćăăžăă ććĄăŽč§Łćąşă漽ăăżăŤăăŚăăžăă =ďź
ç§ăćŁăăç解ăăŚăăă°ă @ianlancetaylorăŽććĄăŻćŹĄăŽă¨ăăă§ăă
i := 3
foo := m"twice i is %20{i * 2}s :)"
// the compiler will expand to:
foo := map[string]interface{}{
"": "twice i is %20{i * 2}s :)",
"i * 2": 6,
}
ăăŽĺžăĺ°ĺˇé˘ć°ăăăŽăăăăĺŚçăăăăłăăŹăźăĺ ¨ä˝ăĺ庌解ćăăäşĺăŤč§ŁćăăăăăłăăŹăźăăŽăăă¤ăăŽĺŠçšăć´ťç¨ăăžă
ăăăăm "str"ăé˘ć°ăŤĺąéăăă¨ăŠăăŞăă§ăăăăďź
i := 3
foo := m"twice i is %20{i * 2}s :)"
// the compiler will expands to:
foo := m(
[]string{"twice i is ", " :)"}, // split string
[]string{"%20s"}, // formatter for each value
[]interface{}{6}, // values
)
ăăŽé˘ć°ăŤăŻćŹĄăŽăˇă°ăăăŁăăăăžăă
func m(strings []string, formatters []string, values []interface{}) string {}
ăăŽé˘ć°ăŻăäşĺăŤč§ŁćăăăăăłăăŹăźăăăăć´ťç¨ăăăăăŤăRustăprintln!
é˘ć°ă§čĄăăŽă¨ĺć§ăŤăăŻăăăŤĺ¤ăăŽćéŠĺăĺŽčĄă§ăăăăăăăăŠăźăăłăšăĺä¸ăăžăă
ăăă§čŞŹćăăăă¨ăăŚăăăŽăŻăJavascriptăŽăżă°äťăé˘ć°ă¨é常ăŤăăäźźăŚăăăăłăłăă¤ăŠăćĺĺăăăŠăźăăăăăăăăŤăŚăźăśăźé˘ć°ăĺăĺ Ľăăĺż čŚăăăăăŠăăăč°čŤă§ăăžăă
foo.GQL"query { users{ %{expectedFields} } }"
bla.SQL`SELECT *
FROM ...
WHERE FOO=%{valueToSanitize}`
@rodcorsiç§ăăăŞăăŽććĄăćŁăăčŞăă§ăăĺ ´ĺăăłăłăă¤ăŠăŻ%20s
ăŽéĺ§ä˝ç˝Žă¨çľäşä˝ç˝Žăç解ăăĺż
čŚăăăăăăéŠĺăŞč¨čŞăŤfmt.Printf
ăăŠăźăăăăçľăżčžźăĺż
čŚăăăăžăă ăăăŻç§ăéżăăăă¨ăăŚăăăă¨ăŽ1ă¤ă§ăă
ăžăăç§ăŽććĄăŻfmt.Printf
ăŽăăŠăźăăăă¨ăŻăžăŁăăé˘äżăăŞăăäťăŽç¨ŽéĄăŽčŁéăŤă使ç¨ă§ăăăă¨ăŤćł¨ćăăŚăă ăăă
m"..."
ăé˘ć°ĺźăłĺşăăŤćĄĺźľăăăăŽă¨ăăŚćąăăŽăŻĺ寞ă§ăăăăăŻăĺŽéăŤä˝ă辡ăăŁăŚăăăŽăăăăăăŤăăăŞăăé˘ć°ĺźăłĺşăăŽ2çŞçŽăŽć§ćăĺšćçăŤčż˝ĺ ăăăăăă§ăă ä¸čŹăŤăăăăăăăć§é ĺăăă襨çžă渥ăăă¨ăŻĺççă§ăăăăăŤćăăăžăăăăăŻăăŠăă§ă解ćĺä˝ăŽä¸č´ăăĺĺŽčŁ
ăĺż
čŚăŤăŞăăŽăéżăăăăă§ăă ăăăăăä¸ĺŽăŽćĺĺăťăŻăˇă§ăłăŽăšăŠă¤ăšăä¸ăăŁăă§ĺ˛ăžăăćĺĺăŽăšăŠă¤ăšăăăăłă¤ăłăżăźăă§ă¤ăšăšăŠă¤ăšăĺŤăĺç´ăŞć§é ä˝ă§ăăďź
m"Hello {name}" ->
struct{...}{
[]string{"Hello ", ""},
[]string{"name"},
[]interface{}{"Gopher"}
2çŞçŽă¨3çŞçŽăŽăšăŠă¤ăšăŻĺăéˇăă§ăăĺż
čŚăăăăćĺăŽăšăŠă¤ăšăŻ1ă¤éˇăăŞăăă°ăŞăăžăăă ăăă襨çžăăŚăăăŽĺśç´ăć§é çăŤă¨ăłăłăźăăăćšćłăŻäťăŤăăăăžăă
ăăăĺ
ăŽćĺĺăç´ćĽĺ
Źéăă形ĺźăŤĺăĺŠçšăŻăăăă使ç¨ăăé˘ć°ăŤćŁăăăăăŠăźăăłăšăŽéŤăăăźăľăźăĺŤăăĺż
čŚă硊ăăă¨ă§ăă ă¨ăšăąăźăćĺăžăăŻăăšăăăămćĺĺăăľăăźăăăăŚăăŞăĺ ´ĺăăăăŻăăăă大ăăăă¨ă§ăŻăăăžăăăăăăŽăăźăľăźăĺĺŽčŁ
ăăŚăăšăăăĺż
čŚăŻăŞăăăăŽçľćăăăŁăăˇăĽăăă¨ăŠăłăżă¤ă ăĄă˘ăŞăŞăźăŻăçşçăăĺŻč˝ć§ăăăăžăă
ăăăŠăźăăăăŞăăˇă§ăłăăăăŽć§ćă使ç¨ăăăă¨ăé ťçšăŤćăă§ăăĺ ´ĺăäťć§ăŤăăăăŽĺ ´ćăăăăă¨ăăăăăžăăăĺäşşçăŤăŻăăłăłăă¤ăŠăăăšăŚă渥ăm"{name} is {age:%.2f} years old"
ăŽăăăŞć§ćă使ç¨ăăžăé˘ć°ă¸ăŽ:
ăŽĺžă
ăăăŤăĄăŻç§ăŻăăŽććĄăŤăľăăźăăčż˝ĺ ăăăăăŤăăăŤă¤ăăŚăłăĄăłăăăăă¨ćăăžăăă ç§ăŻéĺť5ĺš´éăăăžăăžăŞč¨čŞďźKotlinăScalaăJavaăJavascriptăPythonăBashăä¸é¨ăŽCăŞăŠďźă使ç¨ăăŚăăăçžĺ¨GoăĺŚçżăăŚăăžăă
ćĺĺčŁéăŻăĺć¨čŤă¨ĺăăăăŤăçžäťŁăŽăăă°ăŠăăłă°č¨čŞă§ăŻĺż é ă ă¨ćăăžăăGoă§ăăăă§ăă
Sprintfă§ĺăăă¨ăéćă§ăăă¨ä¸ťĺźľăăäşşăŤă¨ăŁăŚăŻăGoă§ĺć¨čŤăăăççąăăăăăžăăăăĺăćŁăăč¨čż°ăăŚĺăăă¨ăéćă§ăăžăăďź ăăăăăă§ăăăăăă§ăŽăă¤ăłăăŻăćĺĺčŁéăŤăăŁăŚăăăăéćăăăăăŤĺż čŚăŞĺéˇć§ăĺ¤§ĺš ăŤĺć¸ăăăčŞăżăăăăŞăăă¨ă§ăďźSprintfă使ç¨ăăă¨ăĺźć°ăŞăšăă¨ćĺĺăŤă¸ăŁăłăăăŚăćĺłăç解ăăĺż čŚăăăăžăăćĺĺďźă
ĺŽéăŽă˝ăăăŚă§ă˘ă§ăŻăăăăŻé常ăŤăăăăăćŠč˝ă§ăă
GoăŽăăăăŞăšăăăśă¤ăłăŤĺ寞ă§ăăďź ăăăăăăăŻăłăźăăč¤éăŤăăďźçśćżăŽăăăŞďźăŻăŹă¤ă¸ăźăŞăă¨ăć˝čąĄĺăĺŻč˝ăŤăăćŠč˝ă§ăŻăŞăăăłăźăăčŞăă¨ăăŤć¸ăéăć¸ăăăŚć確ăŤăăćšćłă§ăăăGoăä˝ă§ăăăăŤĺăăŞăă¨ç§ăŻäżĄăăŚăăžăăăăă¨ăăŚăăžăďźĺć¨čŤăăăăďź=ćźçŽĺăŞăŠăăăăžăďźă
éçĺäťăă使ç¨ăăč¨čŞăŤĺŻžăăŚćŁăăăăŠăźăăăăăăžă
HaskellăŤăŻăćĺĺčŁéç¨ăŽăŠă¤ăăŠăŞă¨č¨čŞćĄĺźľćŠč˝ăăăăžăă ĺĽăŤăżă¤ăăăăŞăă
ćăĺčăŤăŞăăłăĄăłă
ç§ăŤă¨ăŁăŚăč¨čŞăŤćĺĺčŁéăĺŤăăççąă¨ăăŚăŽăżă¤ăăă§ăăŻăŻăăăťăŠé ĺçă§ăŻăăăžăăă
fmt.Printf
ăŤĺ¤ć°ăć¸ăčžźăé ĺşăŤäžĺăăŞăăăăéčŚăŞççąăăăăžăăććĄăŽčŞŹćăăäžăŽ1ă¤ăĺăä¸ăăŚăćĺĺčŁéă使ç¨ăăĺ ´ĺă¨ä˝żç¨ăăŞăĺ ´ĺăŽGoă§č¨čż°ăăžăă
ç§ăŤă¨ăŁăŚă2çŞçŽăŽăăźă¸ă§ăłăŻăĺ¤ć°ăć¸ăčžźăé ĺşăŤäžĺăăŞăăăăčŞăżĺăă¨ĺ¤ć´ăç°Ąĺă§ăă¨ăŠăźăçşçăăŤăăăŞăŁăŚăăžăă
ćĺăŽăăźă¸ă§ăłăčŞăă¨ăăŻăčĄăć°ĺčŞăżç´ăăŚćŁăăăă¨ă確čŞăăĺż čŚăăăăžăăçŽăĺĺžăŤĺăăăŚăăďź văăŽä˝ç˝Žă¨é 罎ăăĺż čŚăŽăăĺ ´ćăŽéăŤăĄăłăżăŤăăăăłă°ăä˝ćăăžăăĺ¤ć°ă
ç§ăŻăăăźăżăăźăšăŻă¨ăŞăĺ¤ăăŽăďźăă§č¨čż°ăăăŚăăăăă¤ăăŽă˘ăăŞăąăźăˇă§ăłďźGoă§č¨čż°ăăăŚăăžăăăăĺăĺéĄă§ďźăŽăă°ă俎ćŁăăŚăăžăăă ĺĺäťăăăŠăĄăźăżăźďź
SELECT * FROM ? WHERE ? = ? AND ? != false ...
ďźăŽäťŁăăăŤăăăăŤĺ¤ć´ăĺ ăăă¨ďźgităăźă¸ä¸ăŤä¸ćł¨ćă§ăăďźă2ă¤ăŽĺ¤ć°ăŽé ĺşăĺ蝢ăăžăăđŠăăăăŁăŚăéˇćçăŞäżĺŽć§ă厚ćăŤăăăă¨ăçŽçă¨ăăč¨čŞăŽĺ ´ĺăăăŽççąăăăćĺĺčŁéăć¤č¨ăă䞥ĺ¤ăăăă¨ćăăžăă
ăăăŽč¤éăăŤă¤ăăŚďźGoăłăłăă¤ăŠăŽĺ é¨ăăăăăŞăăŽă§ăä¸č¨ă§č¨ăă°ă_ä¸č¨ăŽäžă§ç¤şăă2çŞçŽăŽăăźă¸ă§ăłăćĺăŽăăźă¸ă§ăłăŤĺ¤ćăăă ăă§ăŻăŞăă§ăăăăďź_