I did look at the code briefly. The main thing I noticed was that the return type of float8.Get() was an interface{} - so it's up to the caller to check at runtime whether the value is nil, a float64, or a Status.
So you're right, it's not that they are compile-time unsafe, but rather that you have to write type matching code at each use site. Within a given switch branch, it's safe. On Tuesday, 5 April 2022 at 07:29:09 UTC+1 sam.a....@gmail.com wrote: > Uh, you should check the code: > github.com/jackc/pgtype/blob/master/float8.go If you know what you have > and what you're dealing with, and if you actually check the error result, > you do get safety. If you don't know what you've got, or if you're > iterating through the values, then you end up hitting the sad, sad, > reflective path...for now. > On Saturday, April 2, 2022 at 4:37:36 AM UTC-5 Brian Candler wrote: > >> Correct repository path is: https://github.com/jackc/pgtype >> >> Interesting. These structs generally contain a Status value as well: >> >> type Int8 struct { >> Int int64 >> Status Status >> } >> >> where pgtype.go has: >> >> type Status byte >> >> const ( >> Undefined Status = iota >> Null >> Present >> ) >> >> They also have Set() and Get() methods, although these are not >> compiled-time type safe as they accept and return interface{} >> >> On Friday, 1 April 2022 at 17:40:42 UTC+1 sam.a....@gmail.com wrote: >> >>> >>> Thanks for clarifying that, @Brian. Yeah. It took a bit to warm up to >>> that approach, but the github.com/jackc/pgtypes convinced me that the >>> results were worth it. The benefits: A, package interpretation methods >>> with a piece of data, B, lazily valuate data when needed, and C, gain >>> introspective capability specific to the type and not using reflect >>> On Friday, April 1, 2022 at 4:47:32 AM UTC-5 Brian Candler wrote: >>> >>>> That wasn't literal code with anglebrackets - you're supposed to fill >>>> that in yourself. I think he meant something like: >>>> >>>> type fooString struct{ string } >>>> >>>> https://go.dev/play/p/4Q94xMZDciV >>>> >>>> What this is doing is *embedding* a string value into a struct; if you >>>> have not come across type embedding before then Google for the details. >>>> >>>> You still cannot use one of these types transparently as a string, but >>>> you can use >>>> x.string >>>> instead of >>>> string(x) >>>> to extract the value. >>>> >>>> On Friday, 1 April 2022 at 06:48:04 UTC+1 yan.z...@gmail.com wrote: >>>> >>>>> Hi Sam! Your solution does not seem to work: >>>>> >>>>> package main >>>>> >>>>> import( >>>>> "fmt" >>>>> "strconv" >>>>> ) >>>>> >>>>> type <Purpose> String struct{string} >>>>> >>>>> func (s String) print(){ >>>>> fmt.Println(s) >>>>> } >>>>> >>>>> func main() { >>>>> var a String ="hello, world\n" >>>>> >>>>> a.print() >>>>> >>>>> fmt.Println(strconv.ParseInt("78",10, 64)) >>>>> >>>>> var x String ="452" >>>>> >>>>> n, _ := strconv.ParseInt(x, 10, 64) >>>>> } >>>>> >>>>> 在2022年3月26日星期六 UTC+8 06:41:15<sam.a....@gmail.com> 写道: >>>>> >>>>>> >>>>>> My workaround like is something like `type <Purpose>String >>>>>> struct{string}. It can be reasonably treated as a string for most cases >>>>>> in >>>>>> which as string is needed, and it lets you convert back conveniently >>>>>> from >>>>>> any scope in which it's reasonable for your program to know the >>>>>> difference. >>>>>> On Friday, March 18, 2022 at 12:46:34 AM UTC-5 Henry wrote: >>>>>> >>>>>>> My own preference is to have a small number of methods and put the >>>>>>> general functionalities into functions. By putting the general >>>>>>> functionalities into functions, you allow code reuse. In >>>>>>> object-oriented >>>>>>> programming, you normally attach as many functionalities as possible to >>>>>>> their corresponding types and achieve code reuse via inheritance. Since >>>>>>> Go >>>>>>> does not have inheritance, you can achieve a similar effect with >>>>>>> standalone >>>>>>> functions. >>>>>>> >>>>>>> On Friday, March 18, 2022 at 11:26:51 AM UTC+7 Ian Lance Taylor >>>>>>> wrote: >>>>>>> >>>>>>>> On Thu, Mar 17, 2022 at 7:17 PM Zhaoxun Yan <yan.z...@gmail.com> >>>>>>>> wrote: >>>>>>>> > >>>>>>>> > I just came across this taboo in golang - new methods cannot be >>>>>>>> added to an existing type: >>>>>>>> >>>>>>>> Yes. If we didn't have this prohibition, then the set of interfaces >>>>>>>> satisfied by a type would depend on which package was using the >>>>>>>> type. >>>>>>>> >>>>>>>> See the discussion at https://go.dev/issue/21401. >>>>>>>> >>>>>>>> Ian >>>>>>>> >>>>>>> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/7eb21321-caaa-46be-9853-3c6b5e8f8a09n%40googlegroups.com.